Eas*_*sun 2 python multiprocessing python-3.x
我制作了一个自定义部分函数,如下所示:
(Python 3.6.5 |Anaconda 自定义(64 位)| (默认,2018 年 3 月 29 日,13:32:41)[MSC v.1900 64 位 (AMD64)])
In [1]: class SecPartialF(object):
...: def __init__(self, func, arg1):
...: self.func, self.arg1 = func, arg1
...: def __call__(self, arg2):
...: return self.func(self.arg1, arg2)
...:
Run Code Online (Sandbox Code Playgroud)
它适用于构建map:
In [2]: def f(x, y):
...: print(x, y)
...: return x + y
In [3]: list(map(SecPartialF(f, 10), range(10)))
10 0
10 1
10 2
10 3
10 4
10 5
10 6
10 7
10 8
10 9
Out[3]: [10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
Run Code Online (Sandbox Code Playgroud)
但是,它不适用于多处理。挂起pool.map并且没有任何输出:
In [4]: from multiprocessing import Pool
In [5]: with Pool(4) as pool:
...: list(pool.map(SecPartialF(f, 10), range(10)))
...:
Run Code Online (Sandbox Code Playgroud)
我的自定义部分函数有什么问题?
这与您的自定义部分功能无关。
\n\n问题是,正如文档中所解释的,您需要将顶级代码放在__main__块中:
if __name__ == \'__main__\':\n with Pool(4) as pool:\n list(pool.map(SecPartialF(f, 10), range(10)))\nRun Code Online (Sandbox Code Playgroud)\n\n否则,池中的每个子进程将在执行任何其他操作之前尝试创建另一个包含 4 个子进程的池。
\n\n请注意,这只发生在spawn和forkserverstart 方法\xe2\x80\x94 上,但 Windows 默认为spawn(其他平台默认为fork),所以它会发生在你身上。
| 归档时间: |
|
| 查看次数: |
3962 次 |
| 最近记录: |