簡體   English   中英

pytest 是否支持 multiprocessing.set_start_method?

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

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