python3多进程示例导致电脑崩溃 :(
我刚接触多进程编程
我试过一些在其他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。尝试结束一些进程后,我的鼠标也不动了。这已经是我第二次被迫重启电脑了。
我现在太害怕再尝试第三个例子了...
我的电脑配置是 - Intel(R) Core(TM) i7 CPU 870 @ 2.93GHz(8个CPU),大约2.9GHz,运行的是win7 64位
如果有人知道问题出在哪里,并能提供一个非常简单的多进程示例(比如发送一个字符串到多进程,修改它,然后再发送回来打印),我将非常感激。
3 个回答
0
我可以推荐你看看这个链接吗?虽然它讲的是线程,而不是多进程,但很多基本原理是相似的。
4
因为在Windows上,multiprocessing
的工作方式是子进程会导入__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()
10
来自文档:
确保主模块可以被新的Python解释器安全地导入,而不会引起意外的副作用(比如启动一个新的进程)。
因此,在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)