[英]How to use multiprocessing to create threads in python?
我試圖使用 Process 在 python 中創建線程。
但它一直顯示錯誤。
這是我的代碼:
from multiprocessing import Process
import threading
class OneProcess(Process):
def __init__(self):
super().__init__()
self.workers = []
for i in range(5):
worker = OneThread()
self.workers.append(worker)
def run(self):
for worker in self.workers:
worker.start()
for worker in self.workers:
worker.join()
class OneThread(threading.Thread):
def __init__(self):
super().__init__()
def run(self):
print("do somethings")
class Shell():
def __init__(self):
self.first_process = OneProcess()
def start(self):
self.first_process.start()
if __name__ == "__main__":
shell = Shell()
shell.start()
這是錯誤:
ForkingPickler(file, protocol).dump(obj)
TypeError: can't pickle _thread.lock objects
我想它只是無法對線程 object 進行序列化? 那么有沒有什么方法可以實現呢? 還是在 python 中無法使用 Process 創建線程?
我希望@rdas 將他的評論變成一個實際的答案。 由於沒有任何消息,我將盡我所能回答:
您的代碼實際上在 Linux 下工作。 所以我猜你是在 Windows 下運行的(我對其他環境還不夠了解,比如 Mac)。 線程是在 class OneProcess
的__init__
方法中創建的,該方法在與主進程相同的進程下執行。 這在下面的修改代碼中得到了證明。 但是當執行語句self.first_process.start()
導致OneProcess.run()
時,我們現在正在運行的是子OnceProcess
,因此必須使用pickle
,這就是發生錯誤的地方。 通過將線程的創建移至run
方法,沒有線程相關的 state 被腌制。
from multiprocessing import Process
import threading
import os
class OneProcess(Process):
def __init__(self):
super().__init__()
print('OneProcess __init__:', os.getpid())
def run(self):
print('OneProcess run:', os.getpid())
self.workers = []
for i in range(5):
worker = OneThread()
self.workers.append(worker)
for worker in self.workers:
worker.start()
for worker in self.workers:
worker.join()
class OneThread(threading.Thread):
def __init__(self):
super().__init__()
def run(self):
print("do somethings")
class Shell():
def __init__(self):
self.first_process = OneProcess()
def start(self):
self.first_process.start()
if __name__ == "__main__":
print('main pid:', os.getpid())
shell = Shell()
shell.start()
印刷:
main pid: 25208
OneProcess __init__: 25208
OneProcess run: 18912
do somethings
do somethings
do somethings
do somethings
do somethings
為什么您的原始代碼在 Linux 中有效? 這與支持 OS fork()
調用的 Linux 有關,該調用在創建新子進程時復制整個過程,因此不必依賴使用pickle
來傳輸 state。 請參閱當我調用 multiprocessing.Process 時腌制了什么?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.