python3多处理示例崩溃了我的电脑:(

时间:2012-01-06 14:20:57

标签: python python-3.x multiprocessing

我是多处理新手

我已经为两个“强烈推荐”的多处理示例运行了示例代码,以响应其他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

如果有人知道问题是什么,并且可以提供一个非常简单的多处理示例(发送字符串也是一个多进程,更改它并将其发送回打印)我将非常感激。

3 个答案:

答案 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吗?它使用线程而不是多处理,但许多原则是相同的。