我是多处理新手
我已经为两个“强烈推荐”的多处理示例运行了示例代码,以响应其他stackoverflow多处理问题。这是一个例子(我不敢再跑了!)
test2.py (从pydev运行)
import multiprocessing
class MyFancyClass(object):
def __init__(self, name):
self.name = name
def do_something(self):
proc_name = multiprocessing.current_process().name
print(proc_name, self.name)
def worker(q):
obj = q.get()
obj.do_something()
queue = multiprocessing.Queue()
p = multiprocessing.Process(target=worker, args=(queue,))
p.start()
queue.put(MyFancyClass('Fancy Dan'))
# Wait for the worker to finish
queue.close()
queue.join_thread()
p.join()
当我运行这个时,我的计算机很快就会慢下来。它逐渐变慢。过了一段时间,我设法进入任务管理器只看到进程选项卡下的许多许多python.exe。在尝试结束某些过程后,我的鼠标停止移动。这是我第二次被迫重启。
我太害怕尝试第三个例子......
运行 - 英特尔(R)酷睿(TM)i7 CPU 870 @ 2.93GHz(8个CPU),win7 64上约2.9GHz
如果有人知道问题是什么,并且可以提供一个非常简单的多处理示例(发送字符串也是一个多进程,更改它并将其发送回打印)我将非常感激。
答案 0 :(得分:9)
来自the docs:
确保新模块可以安全地导入主模块 口译员没有引起意外的副作用(这样的开始a 新进程)。
因此,在Windows上,您必须将代码包装在
中if __name__=='__main__':
块。
例如,这会向工作进程发送一个字符串,字符串被反转,结果由主进程打印:
import multiprocessing as mp
def worker(inq,outq):
obj = inq.get()
obj = obj[::-1]
outq.put(obj)
if __name__=='__main__':
inq = mp.Queue()
outq = mp.Queue()
p = mp.Process(target=worker, args=(inq,outq))
p.start()
inq.put('Fancy Dan')
# Wait for the worker to finish
p.join()
result = outq.get()
print(result)
答案 1 :(得分:4)
由于multiprocessing
在Windows上的工作方式(子进程导入__main__
模块),__main__
模块在导入时实际上无法运行任何内容 - 任何直接运行时应执行的代码必须受if __name__ == '__main__'
成语保护。您更正后的代码:
import multiprocessing
class MyFancyClass(object):
def __init__(self, name):
self.name = name
def do_something(self):
proc_name = multiprocessing.current_process().name
print(proc_name, self.name)
def worker(q):
obj = q.get()
obj.do_something()
if __name__ == '__main__':
queue = multiprocessing.Queue()
p = multiprocessing.Process(target=worker, args=(queue,))
p.start()
queue.put(MyFancyClass('Fancy Dan'))
# Wait for the worker to finish
queue.close()
queue.join_thread()
p.join()
答案 2 :(得分:0)
我可以建议this link吗?它使用线程而不是多处理,但许多原则是相同的。