Questions tagged «python-multiprocessing»

8
Python多处理PicklingError:无法腌制<type'function'>
很抱歉,我无法使用更简单的示例重现该错误,并且我的代码过于复杂,无法发布。如果我在IPython Shell中而不是在常规Python中运行该程序,那么效果会很好。 我查阅了有关此问题的以前的笔记。它们都是由使用池调用在类函数中定义的函数引起的。但这不是我的情况。 Exception in thread Thread-3: Traceback (most recent call last): File "/usr/lib64/python2.7/threading.py", line 552, in __bootstrap_inner self.run() File "/usr/lib64/python2.7/threading.py", line 505, in run self.__target(*self.__args, **self.__kwargs) File "/usr/lib64/python2.7/multiprocessing/pool.py", line 313, in _handle_tasks put(task) PicklingError: Can't pickle &lt;type 'function'&gt;: attribute lookup __builtin__.function failed 我将不胜感激任何帮助。 更新:我的泡菜功能定义在模块的顶层。虽然它调用包含嵌套函数的函数。即f()要求g()调用h()具有嵌套函数i(),和我打电话pool.apply_async(f)。f(),g(),h()都在顶层定义。我用这种模式尝试了更简单的示例,尽管它可以工作。

12
如何恢复传递给multiprocessing.Process的函数的返回值?
在下面的示例代码中,我想恢复该函数的返回值 worker。我该怎么做呢?此值存储在哪里? 示例代码: import multiprocessing def worker(procnum): '''worker function''' print str(procnum) + ' represent!' return procnum if __name__ == '__main__': jobs = [] for i in range(5): p = multiprocessing.Process(target=worker, args=(i,)) jobs.append(p) p.start() for proc in jobs: proc.join() print jobs 输出: 0 represent! 1 represent! 2 represent! 3 represent! 4 …

1
multiprocessing.Pool:map_async和imap有什么区别?
我想学习如何使用Python的multiprocessing包,但我不明白之间的差别map_async和imap。我注意到两者map_async和imap都是异步执行的。那么我什么时候应该使用另一个呢?我应该如何检索返回的结果map_async? 我应该使用这样的东西吗? def test(): result = pool.map_async() pool.close() pool.join() return result.get() result=test() for i in result: print i


2
在多个进程之间共享结果队列
该multiprocessing模块的文档显示了如何将队列传递给以开头的进程multiprocessing.Process。但是,如何与开始的异步工作进程共享队列apply_async?我不需要动态加入或其他任何方法,而只是工人(反复)将其结果报告给基地的一种方法。 import multiprocessing def worker(name, que): que.put("%d is done" % name) if __name__ == '__main__': pool = multiprocessing.Pool(processes=3) q = multiprocessing.Queue() workers = pool.apply_async(worker, (33, q)) 失败的原因是: RuntimeError: Queue objects should only be shared between processes through inheritance。我理解这意味着什么,并且我理解继承的建议,而不是要求进行酸洗/取消酸洗(以及所有Windows特殊限制)。但如何做我通过队列的方式,作品?我找不到一个示例,并且我尝试了多种失败的替代方法。请帮助?

3
Python多处理:了解“块大小”背后的逻辑
哪些因素决定了此类chunksize方法的最佳论点multiprocessing.Pool.map()?该.map()方法似乎对其默认的块大小使用了任意启发式(如下所述);是什么激发了这种选择,并且基于某些特定的情况/设置,是否有一种更周到的方法? 示例-说我是: 传递iterable给的.map()元素大约有1500万; 24个核的机器上工作,使用默认processes = os.cpu_count()内multiprocessing.Pool()。 我天真的想法是给24名工人中的每人一个相等大小的块,即15_000_000 / 24625,000。大块应该在充分利用所有工人的同时减少营业额/间接费用。但这似乎没有为每个工人提供大批量生产的潜在弊端。这是一张不完整的图片,我想念什么? 我的问题的一部分源于if的默认逻辑chunksize=None:both.map()和.starmap()call .map_async(),看起来像这样: def _map_async(self, func, iterable, mapper, chunksize=None, callback=None, error_callback=None): # ... (materialize `iterable` to list if it's an iterator) if chunksize is None: chunksize, extra = divmod(len(iterable), len(self._pool) * 4) # ???? if extra: chunksize += 1 if len(iterable) == …

3
是否可以在子进程中运行功能而无需线程化或编写单独的文件/脚本。
import subprocess def my_function(x): return x + 100 output = subprocess.Popen(my_function, 1) #I would like to pass the function object and its arguments print output #desired output: 101 我只找到有关使用单独的脚本打开子流程的文档。有谁知道如何传递函数对象甚至是传递函数代码的简便方法?
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.