![](/img/trans.png)
[英]Python Why must multiprocessing.set_start_method be invoked in the __name__ == '__main__' clause?
[英]Does pytest support multiprocessing.set_start_method?
multiprocessing.set_start_method
的文檔指出:
請注意,這應該最多被調用一次,並且應該在主模塊的 if name == ' main ' 子句中受到保護。
但是,如果我將multiprocessing.set_start_method('spawn')
放在 pytest 模塊夾具中,我不知道它是否會完美運行。
確實,如文檔中所述,如果嘗試從多個單元測試函數調用multiprocessing.set_start_method()
,將會遇到麻煩。 此外,這將影響您的整個程序,並且可能會與整個測試套件嚴重地互操作。
另外,您可以使用
get_context()
獲得上下文對象。 上下文對象與多處理模塊具有相同的API,並允許一個對象在同一程序中使用多個啟動方法。import multiprocessing as mp def foo(q): q.put('hello') if __name__ == '__main__': ctx = mp.get_context('spawn') q = ctx.Queue() p = ctx.Process(target=foo, args=(q,)) p.start() print(q.get()) p.join() ```
每次測試都可以使用此方法,以避免討論兼容性問題。 可以將其與“ monkeypatching”或“ mocking”結合使用不同的啟動方法來測試您的類:
# my_class.py
import multiprocessing
class MyClass:
def __init__(self):
self._queue = multiprocessing.Queue()
def process(self, x):
# Very simplified example of a method using a multiprocessing Queue
self._queue.put(x)
return self._queue.get()
# tests/test_my_class.py
import multiprocessing
import my_class
def test_spawn(monkeypatch):
ctx = multiprocessing.get_context('spawn')
monkeypatch.setattr(my_class.multiprocessing, "Queue", ctx.Queue)
obj = my_class.MyClass()
assert obj.process(6) == 6
def test_fork(monkeypatch):
ctx = multiprocessing.get_context('fork')
monkeypatch.setattr(my_class.multiprocessing, "Queue", ctx.Queue)
obj = my_class.MyClass()
assert obj.process(6) == 6
如果您確實總是想使用相同的啟動方法,則可以在源代碼樹根目錄下的conftest.py
文件中的會話范圍內設置它。 例如
# conftest.py
import multiprocessing
import pytest
@pytest.fixture(scope="session", autouse=True)
def always_spawn():
multiprocessing.set_start_method("spawn")
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.