2017-05-23 24 views
6

Paylaşılan sırayla aynı anda iki farklı işlevi çalıştırmaya ve hata almaya çalışıyor ... Paylaşılan bir sırayla iki işlevi aynı anda nasıl çalıştırabilirim? Bu ... 7.TypeError: _thread.lock nesnelerini alamıyor

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() 

günlükleri, ben yönetici olarak konsolu çalışan çalıştı bir hata olduğu anlamına ve ben aynı mesajı almak Windows üzerinde

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 ', ileti dizileri arası iletişim içindir. Çok işlemcili işlemler. İşlemler arasında bir şeyler göndermek içindir. – user2357112

+0

@ user2357112 Değişikliği "çok işlemcili" duruma getirdim ve bu sorunu çözdüm. Teşekkür ederim. –

cevap

0

işlevlerini değiştirila from multiprocessing import Queue.

Kök nedeni eski Kuyruk, çok işlemcili iken iş parçacığı Kuyruk modülü için tasarlanmıştır.İşlem modülü.

Ayrıntılar için kaynak kodunu okuyabilir veya bana ulaşabilirsiniz!

+6

Detaylı bilgi için benimle iletişime geçin. – GhostCat