TypeError: can ' T pickle _thread.lock-Objekte
Versuchen, zwei unterschiedliche Funktionen in der gleichen Zeit mit gemeinsamen Warteschlange und bekomme eine Fehlermeldung...wie kann ich zwei Funktionen gleichzeitig mit einer gemeinsamen Warteschlange? Dies ist die Python-version 3.6 unter Windows 7.
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()
Die Protokolle geben einen Fehler, ich habe versucht mit console als administrator an und ich bekomme die gleiche Meldung...
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
queue.Queue
ist für die inter-thread-Kommunikation.multiprocessing.Queue
ist für das senden Dinge zwischen Prozessen.- Ich habe die änderung zu
multiprocessing.Queue
und, dass das Problem behoben wurde. Danke.
Du musst angemeldet sein, um einen Kommentar abzugeben.
multiprocessing.Pool - PicklingError: Can ' T pickle <geben Sie 'thread.lock'>: - Attribut-lookup-thread.Sperre fehlgeschlagen
Bewegen Sie die Warteschlange, um sich selbst, anstatt als argument, um Ihre Funktionen
package
undsend
Ich hatte das gleiche problem mit
Pool()
in Python 3.6.3.Fehler erhalten:
TypeError: can't pickle _thread.RLock objects
Sagen wir, wir wollen, fügen Sie einige Anzahl
num_to_add
auf jedes element der Liste einigenum_list
parallel. Der code ist schematisch so:Hier das problem, dass
self
in Funktionrun_parallel()
kann nicht gebeizt werden, da es eine Instanz der Klasse. Verschieben diese Funktion parallelisiertrun_parallel()
aus der Klasse geholfen. Aber es ist nicht die beste Lösung, da diese Funktion wohl nutzen muss, die Klasse Parameter wieself.num_to_add
und dann übergibt man es als argument.Lösung:
Anderen Vorschläge oben hat mir nicht helfen.
Müssen Sie ändern
from queue import Queue
zufrom multiprocessing import Queue
.Die Wurzel Grund ist die ehemalige Warteschlange ist ausgelegt für Gewinde für Modul-Warteschlange, während die letzteren ist für multiprocessing.Prozess-Modul.
Für details, Lesen Sie einige source-code oder Kontaktieren Sie mich!