问题标签 [python-multiprocessing]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
python - Python多处理PicklingError:无法腌制
很抱歉,我无法用更简单的示例重现错误,而且我的代码太复杂而无法发布。如果我在 IPython shell 而不是常规的 Python 中运行程序,一切都会顺利进行。
我查阅了有关此问题的一些先前注释。它们都是由使用池调用类函数中定义的函数引起的。但这对我来说不是这样。
我将不胜感激任何帮助。
更新:我腌制的功能是在模块的顶层定义的。虽然它调用了一个包含嵌套函数的函数。即,f()
调用具有嵌套函数的g()
调用,而我正在调用。, ,都在顶层定义。我用这种模式尝试了更简单的例子,但它确实有效。h()
i()
pool.apply_async(f)
f()
g()
h()
python - python pool apply_async 和 map_async 不会阻塞完整队列
我对python相当陌生。我正在使用多处理模块读取标准输入上的文本行,以某种方式转换它们并将它们写入数据库。这是我的代码片段:
现在一切正常,直到我开始处理巨大的输入文件(数亿行),然后通过管道传输到我的 python 程序中。在某些时候,当我的数据库变慢时,我看到内存已满。
玩了一会儿,发现 pool.apply_async 和 pool.map_async 从来没有阻塞过,所以要处理的调用队列越来越大。
解决我的问题的正确方法是什么?我希望我可以设置一个参数,一旦达到某个队列长度,它将阻止 pool.apply_async 调用。Java 中的 AFAIR 可以为此目的给 ThreadPoolExecutor 一个具有固定长度的 BlockingQueue。
谢谢!
python - 在多个进程之间共享一个结果队列
该multiprocessing
模块的文档显示了如何将队列传递给以multiprocessing.Process
. 但是如何与以 开头的异步工作进程共享队列apply_async
?我不需要动态加入或其他任何东西,只是工人(反复)将他们的结果报告回基地的一种方式。
这失败了:
RuntimeError: Queue objects should only be shared between processes through inheritance
。我理解这意味着什么,并且我理解继承而不是要求酸洗/解酸(以及所有特殊的 Windows 限制)的建议。但是我如何以一种有效的方式通过队列呢?我找不到一个例子,我尝试了几种以各种方式失败的替代方案。请帮忙?
python - 如何恢复传递给 multiprocessing.Process 的函数的返回值?
在下面的示例代码中,我想恢复 function 的返回值worker
。我该怎么做呢?这个值存储在哪里?
示例代码:
输出:
我似乎无法在存储在jobs
.
python - python多处理,管理器启动进程生成循环
我有一个简单的 python 多处理脚本,它设置了一个试图将工作输出附加到管理器列表的工作人员池。该脚本有 3 个调用堆栈: - main 调用 f1,它产生多个调用另一个函数 g1 的工作进程。当尝试调试脚本时(顺便说一下在 Windows 7/64 位/VS 2010/PyTools 上),脚本会运行到嵌套的进程创建循环中,从而产生无穷无尽的进程。谁能确定为什么?我确定我错过了一些非常简单的东西。这是有问题的代码: -
PS:尝试添加multiprocessing.freeze_support()
到 main 无济于事。
python - 池工作人员未完成所有任务
我有一个相对简单的 python 多处理脚本,它设置了一个工作池,dataframe
通过自定义管理器将输出附加到熊猫。我发现当我在池上调用 close()/join() 时,并不是所有由 apply_async 提交的任务都已完成。
这是一个简化的示例,它提交了 1000 个作业,但只完成了一半,导致断言错误。我是否忽略了一些非常简单的事情,或者这可能是一个错误?
python - Python 多处理:如何删除托管字典键?
我有一个由管理的字典SyncManager
,我正在使用.get()
and.update()
函数来检索和设置字典键和值。但是,该del dict[key]
方法未实施。有没有办法从托管字典键中删除键?
简单的例子:
python - python multiprocessing.Process.Manager 没有产生一致的结果?
我编写了以下代码来说明我看到的问题。我正在尝试使用 aProcess.Manager.list()
来跟踪列表并增加该列表的随机索引。
每次产生 100 个进程时,每个进程都会将列表的随机索引增加 1。因此,人们会期望结果列表的 SUM 每次都相同,对吗?我得到介于 203 和 205 之间的东西。
python - multiprocessing.manager 问题 sys.args
我在一个多处理的小型 Windows 服务应用程序中运行以下 python 代码行。
问题是在运行 Windows 服务时模块 sys 设置中似乎没有属性 argv。因此,我在 python 多处理分叉库中出现以下错误。我希望有人能够对这个问题有所了解。
问题的堆栈跟踪(在 Windows 服务中运行 multiprocessing.Manager 时):
更新
我的问题的一种可能的解决方案是,sys.argv
如果在运行时未设置该值,则我手动设置该值,但这似乎非常不合pythonic。但可能是唯一的解决方案。stackoverflow 的人是怎么想的?
但是,这导致我遇到了 multiprocessing.manager 的一个新问题,其中代码中出现了意外的 EOFError。
python - Python:给定 2 个进程 A 和 B,从 B 调用 A 中的函数
基于:http ://docs.python.org/2/library/multiprocessing.html#managers我正在重写一个示例,将其拆分为 2 个进程,一个客户端和一个服务器。它是以下代码:
此代码有效,并且从客户端我可以从服务器调用 MathsClass 类中的函数。
我遇到的问题是我仅限于在 MathsClass 中直接定义的函数,这些函数不处理来自其他任何地方的数据。
例如,如果在 ManagerServer 中我定义了一个名为“addOuter(self,x,y)”的函数,然后在类 MathsClass 中,在它的函数 add 中我调用 addOuter(),它看不到它,它说它不存在.
所以,我的问题是,给定两个进程 A 和 B,其中 A 的函数定义在与init相同的级别,而不是在另一个类中,我如何从 B 调用 A 中的这些函数?