多重处理:Python代码调用我的方法www.example www.example.com _async().get()不工作

pgvzfuti  于 2023-05-02  发布在  Python
关注(0)|答案(1)|浏览(157)

我试图在我的Jupyter Notebook中运行下面的基本示例代码。

import multiprocessing
import time

def square(x):
    print('=====> ',x)
    return x * x

if __name__ == "__main__":
    pool = multiprocessing.Pool()
    inputs = [0,1,2,3,4]
    outputs_async = pool.map_async(square, inputs)
    print(outputs_async)
    outputs = outputs_async.get(timeout=10)
    print("Output: {}".format(outputs))

我得到下面的输出

<multiprocessing.pool.MapResult object at 0x00000249E3A17188>
---------------------------------------------------------------------------
TimeoutError                              Traceback (most recent call last)
<ipython-input-3-f7d558819a08> in <module>
     12     outputs_async = pool.map_async(square, inputs)
     13     print(outputs_async)
---> 14     outputs = outputs_async.get(timeout=10)
     15     print("Output: {}".format(outputs))

~\Anaconda3\lib\multiprocessing\pool.py in get(self, timeout)
    651         self.wait(timeout)
    652         if not self.ready():
--> 653             raise TimeoutError
    654         if self._success:
    655             return self._value

TimeoutError:

看起来像这样,代码本身没有调用我的square方法。
请帮助如何解决这个问题。
谢啦

rbl8hiat

rbl8hiat1#

作为一种变通方法,将你想在多进程工作器中运行的代码放在一个独立的“。py”模块,一个真实的文件,而不是笔记本单元格,在你的“sys.path”-然后将其用作:

import mymodule
...

    outputs_async = pool.map_async(mymodule.square, inputs)

它可能被破坏的原因是,使用Spawn方法(Windows和Mac中多处理的默认方法),涉及通过使用正常的Python导入机制导入代码运行所需的所有模块-如果代码在笔记本单元格中,则无法导入。
它仍然 * 可能无法工作 *,因为__main__模块本身处于Jupyter的保护之下-但看起来他们(Jupyter开发人员)修补了足够的东西,使其表现得像一个普通的脚本-否则您甚至不会得到上面列出的错误消息。

相关问题