簡體   English   中英

如何在類上下文中以方法為目標啟動流程?

[英]How to start processes with methods as targets in a class context?

我試圖在應該共享隊列的類上下文中啟動多個進程:

import multiprocessing
import queue

class MyMulti:
    def __init__(self):
        self.myq = queue.Queue()

    def printhello(self):
        print("hello")
        self.myq.put("hello")

    def run(self):
        for _ in range(5):
            p = multiprocessing.Process(target=self.printhello)
            p.start()

if __name__ == "__main__":
    multiprocessing.freeze_support()
    m = MyMulti()
    m.run()
    # at that point the queue is being filled in with five elements

這崩潰了

C:\Python34\python.exe C:/Users/yop/dev/GetNessusScans/tests/testm.py
Traceback (most recent call last):
  File "C:/Users/yop/dev/GetNessusScans/tests/testm.py", line 20, in <module>
    m.run()
  File "C:/Users/yop/dev/GetNessusScans/tests/testm.py", line 15, in run
    p.start()
  File "C:\Python34\lib\multiprocessing\process.py", line 105, in start
    self._popen = self._Popen(self)
  File "C:\Python34\lib\multiprocessing\context.py", line 212, in _Popen
    return _default_context.get_context().Process._Popen(process_obj)
  File "C:\Python34\lib\multiprocessing\context.py", line 313, in _Popen
    return Popen(process_obj)
  File "C:\Python34\lib\multiprocessing\popen_spawn_win32.py", line 66, in __init__
    reduction.dump(process_obj, to_child)
  File "C:\Python34\lib\multiprocessing\reduction.py", line 59, in dump
    ForkingPickler(file, protocol).dump(obj)
_pickle.PicklingError: Can't pickle <class '_thread.lock'>: attribute lookup lock on _thread failed

一個類似問題的答案建議具有工作者的最高職能,我將其適應於我的情況,

import multiprocessing
import queue

def work(foo):
    foo.printhello()

class MyMulti:
    def __init__(self):
        self.myq = queue.Queue()

    def printhello(self):
        print("hello")
        self.myq.put("hello")

    def run(self):
        for _ in range(5):
            p = multiprocessing.Process(target=work, args=(self,))
            p.start()

if __name__ == "__main__":
    multiprocessing.freeze_support()
    m = MyMulti()
    m.run()
    # at that point the queue is being filled in with five elements

但是,這崩潰的方式相同。

有沒有一種以方法為目標來啟動流程的方法?

我應該使用self.myq = multiprocessing.Queue()而不是queue.Queue()

除了queue.Queue()之外, multiprocessing.Queue()也是安全的。

我暫時沒有回答這個問題,如果整個方法錯誤,有人可以發表評論。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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