python3多进程示例导致电脑崩溃 :(

4 投票
3 回答
4462 浏览
提问于 2025-04-17 09:40

我刚接触多进程编程

我试过一些在其他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)

撰写回答