2017-05-23 14 views
6

साझा कतार के साथ एक ही समय में दो अलग-अलग फ़ंक्शंस चलाने की कोशिश कर रहा है और एक त्रुटि प्राप्त नहीं कर सकता ... मैं साझा कतार के साथ एक ही समय में दो फ़ंक्शन कैसे चला सकता हूं? यह विंडोज पर पायथन संस्करण 3.6 है 7.TypeError: _thread.lock ऑब्जेक्ट्स

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

लॉग त्रुटि दिखाता है, मैं व्यवस्थापक के रूप में कंसोल चल रहा की कोशिश की और मैं एक ही संदेश मिलता है ...

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

मूल कारण यह है कि पूर्व कतार थ्रेडिंग मॉड्यूल कतार के लिए डिज़ाइन की गई है जबकि उत्तरार्द्ध multiprocessing.Process मॉड्यूल के लिए है।

विवरण के लिए, आप कुछ स्रोत कोड पढ़ सकते हैं या मुझसे संपर्क कर सकते हैं!

+6

विवरण के लिए मुझसे संपर्क करें ... यह नहीं है कि यह समुदाय कैसे काम करता है। – GhostCat

संबंधित मुद्दे