Python 进程数不确定的多进程处理

Python 进程数不确定的多进程处理,python,python-2.7,multiprocessing,Python,Python 2.7,Multiprocessing,我还远没有适应python,从3天开始,我就一直在试图弄清楚如何正确地使用多处理,但现在我遇到了麻烦,需要一些帮助 该程序的基本功能是同时从多个(seni随机)输入控制LED条的不同部分。因此,我得出结论,我可能需要使用多处理 我已经使用Adafruit现有的模块为它编写了一个模块。(我把它拆下来演示) 在self.pixels内部,存储了关于哪个LED应该具有哪个颜色的所有信息。 self.pixels.set_pixel()将新值写入存储器。 self.pixels.show()实际上将这些

我还远没有适应python,从3天开始,我就一直在试图弄清楚如何正确地使用多处理,但现在我遇到了麻烦,需要一些帮助

该程序的基本功能是同时从多个(seni随机)输入控制LED条的不同部分。因此,我得出结论,我可能需要使用多处理

我已经使用Adafruit现有的模块为它编写了一个模块。(我把它拆下来演示)

在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
但我不知道最终的进程数量,因为它们是由外部输入生成的,所以我需要一些方法来控制可变数量的进程。我的想法是使用如下列表:

    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
过程-2:
回溯(最近一次呼叫最后一次):
文件“/usr/lib/python2.7/multiprocessing/process.py”,第258行,在_bootstrap中
self.run()
文件“/usr/lib/python2.7/multiprocessing/process.py”,第114行,正在运行
自我目标(*自我参数,**自我参数)
文件“”,第2行,设置颜色
文件“/usr/lib/python2.7/multiprocessing/managers.py”,第755行,在调用方法中
self._connect()
文件“/usr/lib/python2.7/multiprocessing/managers.py”,第742行,在_connect中
conn=self.\u客户端(self.\u token.address,authkey=self.\u authkey)
客户端中的文件“/usr/lib/python2.7/multiprocessing/connection.py”,第169行
c=SocketClient(地址)
SocketClient中的文件“/usr/lib/python2.7/multiprocessing/connection.py”,第308行
s、 连接(地址)
文件“/usr/lib/python2.7/socket.py”,第228行,meth格式
返回getattr(self.\u sock,name)(*args)
错误:[Errno 2]没有这样的文件或目录
我希望我把我的问题说得尽可能清楚易懂。因为我还没有找到这样的东西,我想我在做一些根本错误的事情。你能帮我吗?
谢谢。

您必须等待所有子进程完成它的工作,并重新启动
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\u children()
api来获取当前进程的所有子进程,以防您确实无法从一开始就收集列表

我想你不应该与
Manager
共享一个类,同时在内部使用
mp.Lock
。谢谢你的输入。不幸的是,即使没有锁定,我仍然会遇到同样的错误。很抱歉,我没有及时回复,我有一段时间没有访问硬件。虽然这是有用的信息,但我并没有真正解决我最初的问题,因为我需要某种无限的过程组织。在您的解决方案中,我仍然需要知道最终的进程数。这是一个未知的数字。目前,我使用线程模块获得了很好的结果,解决了我最初的问题。(我实际上并不需要多处理,这只是我认为可行的方法,并尝试了一下。)如果需要,我可以在这里展示我更新的解决方案。这里可能还有一些禁忌,我希望得到反馈。@Olfred没关系,你可以把我的更新作为参考。
p = Process(...)
p.start()
p = Process(...)
p.start()
p.join()
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)