簡體   English   中英

如何使用多處理在 python 中創建線程?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM