Python 关于多线程和多进程同时共用问题

2019-01-06 17:57:07 +08:00
 smelond

下面这段代码在 windows 下运行就报错 NameError: name 'SEM' is not defined

在 windows7 windows10 测试 报错

在 Mac Linux 下测试 能正常运行

如果我在代码的最上面给 SEM 和 TIME_OUT 赋值后,就能正常运行

但是我需要用户加参数将值带进去,而不是事先定义好,所以只能放到 argparse 里面。我现在很疑惑,这个问题能解决吗?

时间过了两天了,依旧没有解决这个问题,希望小伙伴们能和我一起讨论一下怎么回事,谢谢!

# /usr/bin/env python
# _*_ coding:utf-8 _*_


import argparse, datetime, time
import threading
from multiprocessing import Pool


def test(i):
    with SEM:
        print(i)
        time.sleep(TIME_OUT)


def test1(c):
    threads = []
    for i in range(int(200)):
        t = threading.Thread(target=test, args=(i,))
        t.start()
        threads.append(t)
    for t in threads:
        t.join()


def main():
    start_time = time.time()
    print(datetime.datetime.now().strftime('Start Time: %m/%d/%Y %H:%M:%S'))
    p = Pool(int(args.PROCESS))
    for i in range(10):
        p.apply_async(test1, args=(i,))
    p.close()
    p.join()
    print(datetime.datetime.now().strftime('Complete time: %m/%d/%Y %H:%M:%S'))
    print("Total time:%s" % (time.time() - start_time))


if __name__ == '__main__':
    parser = argparse.ArgumentParser(description='test')
    parser.add_argument('-m', dest='PROCESS', type=int, help='多进程数量,默认 5', default=5)
    parser.add_argument('-t', dest='THREAD', type=int, help='多线程数量,默认 20', default=20)
    parser.add_argument('-o', dest='OVERTIME', type=int, help='超时时间 默认 2', default=2)
    args = parser.parse_args()
    SEM = threading.Semaphore(int(args.THREAD))
    TIME_OUT = int(args.OVERTIME)
    main()

4838 次点击
所在节点    Python
22 条回复
a226679594
2019-01-09 09:22:51 +08:00
一般来说,可以认为 Windows 不能直接使用 multiprocessing,也就是不支持多进程。
old18
2019-01-10 11:10:52 +08:00
多进程不共享全局变量, 把 SEM 存放在消息队列里,就应该好了...

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/524404

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX