python - 具有不确定数量的进程的多处理
问题描述
我远未适应python,自从3天以来,我试图弄清楚如何正确使用多处理,但现在我死了,需要一些帮助。
基本上,该程序应该做的是同时从多个(随机)输入控制 LED 灯条的不同部分。因此我得出结论,我可能需要使用多处理。
我使用 Adafruit 的现有模块为它编写了一个模块。(我将其剥离以进行演示)
import time
import RPi.GPIO as GPIO
from multiprocessing import Lock
import Adafruit_WS2801
import Adafruit_GPIO.SPI as SPI
class Pixels(object):
def __init__(self, pixelCount, spiPort, spiDevice):
self.l = Lock()
self.pixels = Adafruit_WS2801.WS2801Pixels(pixelCount, spi=SPI.SpiDev(spiPort, spiDevice), gpio=GPIO)
# Clear all the pixels to turn them off.
self.pixels.clear()
self.pixels.show()
def set_color(self, target_pixel, color=(255,0,0)):
for k in target_pixel:
self.l.acquire()
self.pixels.set_pixel(k, Adafruit_WS2801.RGB_to_color( color[0], color[1], color[2] ))
self.l.release()
self.l.acquire()
self.pixels.show()
self.l.release()
def blink_color_blank(self, target_pixel, blink_times=1, wait=0.5, color=(255,0,0)):
for i in range(blink_times):
self.set_color(target_pixel, color)
time.sleep(wait)
self.set_color(target_pixel, (0,0,0))
time.sleep(wait)
在 self.pixels 中存储了有关哪个 LED 应该具有哪种颜色的所有信息。self.pixels.set_pixel() 将新值写入存储。self.pixels.show() 实际上将这些值发送到 SPI 总线。
现在我的多处理尝试是这样开始的。
from multiprocessing import Process, Manager
from multiprocessing.managers import BaseManager
import LED_WS2801
if __name__ == '__main__':
BaseManager.register('LedClass', LED_WS2801.Pixels)
manager = BaseManager()
manager.start()
inst = manager.LedClass(10,0,0)
现在,当我启动一个进程而另一个进程仍处于活动状态时,就会出现我的问题。
p = Process(target=inst.blink_color_blank, args=([6,7,8], 10, 0.25, (255,0,0),))
p.start()
p = Process(target=inst.set_color, args=([3,4,5,6],(0,255,0),))
p.start()
p.join()
这给了我以下错误:
Process Process-3:
Traceback (most recent call last):
File "/usr/lib/python2.7/multiprocessing/process.py", line 258, in _bootstrap
self.run()
File "/usr/lib/python2.7/multiprocessing/process.py", line 114, in run
self._target(*self._args, **self._kwargs)
File "<string>", line 2, in blink_color_blank
File "/usr/lib/python2.7/multiprocessing/managers.py", line 759, in _callmethod
kind, result = conn.recv()
EOFError
但是当我做这样的事情时,一切都很好。
p = Process(target=inst.blink_color_blank, args=([6,7,8], 10, 0.25, (255,0,0),))
p.start()
b = Process(target=inst.set_color, args=([3,4,5,6],(0,255,0),))
b.start()
p.join()
b.join()
但是我不知道我的最终进程数,因为它们是由外部输入产生的,所以我需要一些方法来控制可变数量的进程。我的想法是使用这样的列表:
jobs = []
jobs.append(Process(target=inst.set_color, args=([0,1,2],(255,0,255),)))
jobs[0].start()
但令我失望的是,这又带来了另一个错误:
Process Process-2:
Traceback (most recent call last):
File "/usr/lib/python2.7/multiprocessing/process.py", line 258, in _bootstrap
self.run()
File "/usr/lib/python2.7/multiprocessing/process.py", line 114, in run
self._target(*self._args, **self._kwargs)
File "<string>", line 2, in set_color
File "/usr/lib/python2.7/multiprocessing/managers.py", line 755, in _callmethod
self._connect()
File "/usr/lib/python2.7/multiprocessing/managers.py", line 742, in _connect
conn = self._Client(self._token.address, authkey=self._authkey)
File "/usr/lib/python2.7/multiprocessing/connection.py", line 169, in Client
c = SocketClient(address)
File "/usr/lib/python2.7/multiprocessing/connection.py", line 308, in SocketClient
s.connect(address)
File "/usr/lib/python2.7/socket.py", line 228, in meth
return getattr(self._sock,name)(*args)
error: [Errno 2] No such file or directory
我希望我使我的问题尽可能容易理解和清楚。因为我还没有发现这样的东西,所以我想我在做一些根本错误的事情。那请你帮帮我好吗?谢谢你。
解决方案
您必须等待所有子进程完成其工作,并重新分配p
:
p = Process(...)
p.start()
p = Process(...)
p.start()
p.join()
你只是在等待后面的p
完成,当主人想要终止但第一个子进程仍在运行时会出现错误。试试这个等待所有孩子完成:
p1 = Process(target=inst.blink_color_blank, args=([6,7,8], 10, 0.25, (255,0,0),))
p1.start()
p2 = Process(target=inst.set_color, args=([3,4,5,6],(0,255,0),))
p2.start()
childs = [p1, p2]
while any(p.is_alive() for p in childs):
for p in childs:
p.join(1)
此外,还有一个multiprocessing.active_children()
api 可以获取当前进程的所有子进程,以防你真的无法从头开始收集列表。
推荐阅读
- reactjs - 在 React App 中获取损坏的图像
- java - 通过 javax.websocket API 使用 Jetty Websocket Client API:如何设置 MaximumMessageSize?
- java - Java图形抽象drawline方法如何真正起作用?
- html - 媒体查询不适用于定义的像素
- r - R Markdown - 创建动态报告参数
- html - 在文本移动动画中添加淡出
- c++ - 我应该使用 wchar 还是 char 来加密?
- entity-framework - 什么是 efpt.config.json 文件,是否应将其签入源代码管理?
- c++ - 为什么要为未删除的对象调用析构函数?
- excel - 根据条件将用户分组