To nie jest bardzo ważne, tylko głupi eksperyment. Chciałbym stworzyć własną wiadomość przekazującą. Chciałbym mieć słownik kolejek, gdzie każdy klucz jest PID procesu. Ponieważ chciałbym, aby procesy (utworzone przez Process()) wymieniały komunikaty wstawiając je w kolejce procesu, do którego chcą wysłać wiadomość (znając jej pid). Jest to kod głupie:Słownik python kolejek między procesami
from multiprocessing import Process, Manager, Queue
from os import getpid
from time import sleep
def begin(dic, manager, parentQ):
parentQ.put(getpid())
dic[getpid()] = manager.Queue()
dic[getpid()].put("Something...")
if __name__== '__main__':
manager = Manager()
dic = manager.dict()
parentQ = Queue()
p = Process(target = begin, args=(dic, manager, parentQ))
p.start()
son = parentQ.get()
print son
sleep(2)
print dic[son].get()
dic[getpid()] = manager.Queue()
, to działa prawidłowo. Ale kiedy wykonać dic[son].put()/get()
otrzymuję komunikat:
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 "mps.py", line 8, in begin
dic[getpid()].put("Something...")
File "<string>", line 2, in __getitem__
File "/usr/lib/python2.7/multiprocessing/managers.py", line 773, in _callmethod
raise convert_to_error(kind, result)
RemoteError:
---------------------------------------------------------------------------
Unserializable message: ('#RETURN', <Queue.Queue instance at 0x8a92d0c>)
---------------------------------------------------------------------------
Czy wiesz co to jest właściwy sposób to zrobić?