2017-05-23 10 views
6

共有キューで同時に2つの異なる関数を実行しようとしたときにエラーが発生しました...共有キューで同時に2つの関数を実行するにはどうすればよいですか? 3.6 TypeError:_thread.lockオブジェクトをpickleできません

from multiprocessing import Process 
from queue import Queue 
import logging 

def main(): 
    x = DataGenerator() 
    try: 
     x.run() 
    except Exception as e: 
     logging.exception("message") 


class DataGenerator: 

    def __init__(self): 
     logging.basicConfig(filename='testing.log', level=logging.INFO) 

    def run(self): 
     logging.info("Running Generator") 
     queue = Queue() 
     Process(target=self.package, args=(queue,)).start() 
     logging.info("Process started to generate data") 
     Process(target=self.send, args=(queue,)).start() 
     logging.info("Process started to send data.") 

    def package(self, queue): 
     while True: 
      for i in range(16): 
       datagram = bytearray() 
       datagram.append(i) 
       queue.put(datagram) 

    def send(self, queue): 
     byte_array = bytearray() 
     while True: 
      size_of__queue = queue.qsize() 
      logging.info(" queue size %s", size_of_queue) 
      if size_of_queue > 7: 
       for i in range(1, 8): 
        packet = queue.get() 
        byte_array.append(packet) 
       logging.info("Sending datagram ") 
       print(str(datagram)) 
       byte_array(0) 

if __name__ == "__main__": 
    main() 

7. Windows上のログがエラーを示すこれは、私が管理者としてコンソールを実行しようとしたと私は同じメッセージ...

INFO:root:Running Generator 
ERROR:root:message 
Traceback (most recent call last): 
    File "test.py", line 8, in main 
    x.run() 
    File "test.py", line 20, in run 
    Process(target=self.package, args=(queue,)).start() 
    File "C:\ProgramData\Miniconda3\lib\multiprocessing\process.py", line 105, in start 
    self._popen = self._Popen(self) 
    File "C:\ProgramData\Miniconda3\lib\multiprocessing\context.py", line 223, in _Popen 
    return _default_context.get_context().Process._Popen(process_obj) 
    File "C:\ProgramData\Miniconda3\lib\multiprocessing\context.py", line 322, in _Popen 
    return Popen(process_obj) 
    File "C:\ProgramData\Miniconda3\lib\multiprocessing\popen_spawn_win32.py", line 65, in __init__ 
    reduction.dump(process_obj, to_child) 
    File "C:\ProgramData\Miniconda3\lib\multiprocessing\reduction.py", line 60, in dump 
    ForkingPickler(file, protocol).dump(obj) 
TypeError: can't pickle _thread.lock objects 
+2

'queue.Queue'はスレッド間通信用です。 'multiprocessing.Queue'はプロセス間で物事を送るためのものです。 – user2357112

+0

@ user2357112私は 'multiprocessing.Queue'に変更を加え、問題を修正しました。ありがとうございました。 –

答えて

0

を変更する必要があります〜from multiprocessing import Queue

根本的な理由は、元のキューがスレッドモジュールのキュー用で、後者がマルチプロセッシング用です。プロセスモジュール。

詳細については、いくつかのソースコードを読んだり、私に連絡したりすることができます。

+6

詳細は私に連絡してください...これはこのコミュニティの仕組みではありません。 – GhostCat

関連する問題