问题标签 [multiprocessing-manager]
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 manager register issue or just my faulty code
I use a python manager to share data between processes. I wanted to break up my code into smaller pieces and created a function 'soFactory' that would take a dictionary of name/object pairs and register the object with the manager under the given name. In the simple example below I create two lists and register them with the manager. If I use soFactory the manager returns only one of the lists (last one registered) regardless which name I reference. If I unravel the logic of soFactory I get access to the correct object by referencing their registered names. I must be missing something obvious but not seeing it.
python - python manager.dict() 锁定如何工作:
manager.dict ()允许跨进程共享字典并执行线程安全操作。在我的情况下,每个协调器进程都创建共享字典,其中包含m
元素和n
工作进程读取和写入单个字典键。
字典是否managers.dict()
有一个m
锁,每个锁一个锁?
当工人不必相互交流时,除了共享字典之外,还有其他方法可以m
向工人共享元素吗?n
相关的 python-manager-dict-is-very-slow-compared-to-regular-dict
python - Python IPC 与 matplotlib
项目描述:
将现有的“C”程序(主控件)连接到 Python GUI/Widget。为此,我使用了 FIFO。C 程序旨在查看基于帧的遥测。
Python GUI 执行两个功能:
- 根据用户的需要(单个 .py 文件,不同用户编写的脚本)通过 GUI 小部件运行/创建绘图(可能通过 matplotlib 创建)
- 在创建后将帧号中继到 python 绘图脚本,以便在从主程序获得帧号后它们可以“更新”自己。
我有几个问题——了解这里看到的多处理与多线程的优缺点:Multiprocessing vs Threading Python
实施注意事项:
我猜,在基于信号的架构中通过线程创建的图太多,在更新它们方面可能会变得滞后。我不确定它们什么时候会受到 CPU 的限制……大多数情节会更新几行系列,有些可能会更新图像。无论创建方法如何,无论我选择哪种方式,它都可能会滞后。
我不确定打开 30 个 python 进程是什么,每个进程使用 matplotlib 制作一两个绘图对机器或其资源有什么作用。我在我的系统上看到一个简单的 matplotlib 图的 RSS(分配的内存)为 117M,所以我认为如果通过为每个图打开单独的进程来完成,单个用户绘制 30 个图不会限制系统内存。(16 GB,32 核 Linux Box,同时有多个用户)
问题:
- 我是否应该通过线程或进程打开绘图,并且其中一个会比另一个滞后?
- 如果我使用线程,是否有人知道在单个线程上变得滞后之前需要更新多少 matplotlib 数字?
- 如果我将绘图创建为进程,我应该使用 multiprocessing 包吗?我猜这个 API 可以直接在进程之间传递帧号?
- 鉴于我有可用的多处理,尝试通过 POpen 打开进程可能很愚蠢,对吗?我猜是这种情况,因为如果我这样做,我将不得不自己设置所有管道/IPC,这会更有效吗?
python - Python multiprocessing Manger OSError“每个套接字地址仅使用一次”
我正在 python (3.4.4) 中创建一个通信平台并使用multiprocessing.managers.BaseManager类。我已将问题隔离到下面的代码中。
目的是让ROVManager(role='server')实例在主计算机上的一个进程中运行,并为在同一台计算机上运行的多个ROVManager(role='client')实例提供系统字典的读/写功能,并且连接到同一网络的 ROV(遥控车辆)。这样,多个客户端/进程可以执行不同的任务,例如读取传感器值、移动电机、打印、记录等,所有这些都使用同一个字典。下面的start_reader()就是这些客户端之一。
代码
错误
这会导致以下输出和错误:
我的研究
总的 while 循环通常在 15000-16000 范围内。据我了解,每次调用 mgr.system().get('shutdown')时似乎都会创建和终止一个套接字。然后 Windows 会用完可用的套接字。我似乎找不到设置socket.SO_REUSEADDR的方法。
有没有办法解决这个问题,或者经理不是为这种沟通而生的?谢谢 :)
python - 在 python 进程之间共享 tkinter 窗口对象
以下是我正在处理的场景:
有一个使用 Multiprocessing.Process 启动工作进程的主进程。工作进程创建用于渲染的 tkinter 窗口。如果我希望终止渲染,我只需执行 process.terminate()。尽管这以编程方式有效,但我在屏幕上看到了一些伪影,因为没有正确完成窗口破坏。我的计划是与主进程共享 tkinter 对象,从而使其能够退出然后销毁窗口。
我试过了, Multiprocessing.Queue , Multiprocessing.Manager 但由于以下错误,都没有工作:
我认为我的假设是错误的。实现此目的的适当 python 编程技术是什么?
python - 如何在python中的进程之间并行化类方法或共享类对象?
我创建了一个包含其所有实例的类,需要并行化实例化过程,但无法解决将类作为类对象共享的问题。在 python 2.7 中是否可以使用多处理?
我尝试使用multiprocessing.managers.BaseManager
, 为 MyContainer 类创建代理,但它只能以这种方式创建实例对象。我实际上想并行化MyContainer(dat_file)
调用。
python - 将具有多个线程的 Flask 服务器连接到单个服务器端线程
我在 Raspberry Pi 上编写了一个 python 脚本,它控制着一个大型且有些复杂的硬件。目前使用界面是python控制台。我运行 python 程序,并且可以从控制台输入命令input("> ")
。
现在我想为这个程序添加一个网络界面,我正在尝试找出正确的方法来做到这一点。我已经在flask中编写了一个基本的web UI,但是我还没有找到一个连接flask界面和主脚本的好方法。因为服务器控制单个硬件,所以主对象(处理硬件控制)只实例化一次。此外,每次运行脚本(每次创建主对象时)都必须进行重要的硬件配置。
Flask 似乎为每个客户端会话创建一个新线程,并且只在该会话中保留变量。如何将烧瓶事件(即网络用户按下按钮)链接到主对象中的方法?
我是否使用了错误的工具来完成这项工作?什么是正确的工具?这样做的正确方法是什么?或者,什么是jank方式来做到这一点?
编辑:链接的问题是相似的,并引导我找到下面的答案,但他们真的没有回答这个问题,只是指向一些解决该特定示例的代码。我认为下面的答案更有帮助。(当然我有点偏见;我写的)
我找到了解决方案,所以我会在这里分享。(我想我无法回答自己的问题?)
Flask Web App 系统(以及所有 WSGI Web 应用程序?)依赖于 Web 应用程序可以在全新环境中执行的原则,而无需在创建时传递对象。我想这对Web Apps来说是有意义的,但它给Web UI增加了很多烦人的复杂性,也就是说,Web 界面专门用于连接更大程序的单个实例。作为硬件/解决方案工程师,我倾向于需要一个 Web UI 来控制单个硬件。如果为此目的有比烧瓶更好的东西,请发表评论。但是烧瓶很好,我现在知道它可以用于此目的。
Flask Web 应用程序并非旨在自己完成“繁重的工作”。它们保持非常有限的状态(即每个请求都会触发一个新的上下文),并且如前所述,不能将引用传递给其他对象。在适当的Web 应用程序中,全栈开发人员会将 Flask 连接到数据库服务器和其他此类 WebDev-y 系统。为了控制硬件,我们的目标是在另一个 python 进程(很可能是一个单独执行的进程)中触发一些任意方法的执行。
在 python 中,实现此执行的一种便捷方法是multiprocessing.managers
模块。管理器是一种工具,可让您轻松构建代理,它可以跨进程链接对象。如果您有一个对象bar = Bar()
,您可以生成一个<AutoProxy[get_bar]>
代理,它允许您bar
从远处操纵原始对象。远处可以在子进程中,在互联网上的另一台计算机上。这是一个例子。
服务器.py:
客户端.py:
所以这里有一些有趣的事情需要注意。首先,我们可以从任意多的客户端获取 get_bar(),它们都会指向同一个bar
. 其次,我们可以从客户端调用 bar、read() 和 write() 中的方法,而无需Bar
手头的类。挺整洁的。
那么如何使用这个呢?如果你有一个支持控制台的程序,首先把它分成两部分,控制台和它控制的功能。将该功能封装在少数几个对象中,这些对象共同构成应用程序的实例。在上面进行修改server.py
以实例化这些对象,并使用管理器中的方法将它们托管出来get
。然后调整您的控制台界面以连接client.py
并使用代理而不是实际对象。最后,设置一个烧瓶应用程序,该应用程序也连接到服务器并提供 Web 界面。
现在您是真正的 Web 开发人员了!RIP。
python - python中的multiprocessing.process,用于使用共享队列中的值的并行进程
我正在尝试利用 python 多处理池从共享队列中获取值并在工作进程中使用。
从我得到的输出中,我看到只启动了一个进程,将所有值从队列中取出。如何并行生成多个进程,不断从队列中获取值。我对可能大于队列大小的进程数有最大限制。请在这方面指导我。谢谢。
PS:这只是一个例子。实际任务是将数据从一种形式迁移到另一种形式,并对数据进行一些繁重的操作。
更新:我做了以下修改,它们似乎工作,除了 pool.join() 阻止主进程退出,即使所有子进程都退出。
python-2.7 - multiprocessing.Manager().Queue() TypeError: can't pickle thread.lock objects
我将 multiprocessing.Manaager().Queue() 的实例对象 (q) 分配给 multiprocessing.Manager().dict() 的实例对象 (d) 的一项,但我无法重用 dict 中的 q .
Python 的版本是 2.7.15。
输出
python - Python多处理中写入共享内存(列表)的同步
我有以下代码:
如果列表的长度小于 4,则附加列表或创建具有初始值“y”的新列表的函数。
初始化列表和创建进程。
我得到的输出:
我不明白为什么列表只附加一次。我希望在第三个输出行中我会观察到列表 ['y'] 附加了'x',所以 ['y', 'x'],第四个 ['y', 'x', 'x']等等。似乎共享内存泄漏或不允许通过多个进程的函数进行更改。我可以做些什么来启用目标行为?