Hacktoberfest 2026:維護者為十月標記出來的 issue,仍然開放、適合新手。 瀏覽 Hacktoberfest issue

`testing/test_channel.py::TestChannelBasicBehaviour::test_channel_callback_remote_freed` tests fail on Python 3.13.0 freethreading

未關閉
#306 1 則留言 0 個 reaction 已指派 0 人 在 GitHub 檢視

還沒有人認領這個 Issue。

評估

難度
3/5
預估耗時
1-2 天
新手友好度
45/100
Issue 類型
缺陷
描述清晰度
基本清楚
活躍度
停滯
技術堆疊
python

研究方向

從 testing/test_channel.py::TestChannelBasicBehaviour::test_channel_callback_remote_freed 開始,使用所示的 pytest 命令在 Python 3.13.0 freethreading 上重現它。檢查 src/execnet/gateway_base.py 中 Channel.waitclose() 附近的程式碼以及回報的逾時,然後確認受影響的 gateway 的 callback 相關 channel 能夠關閉而不會逾時。

由索引模型根據 Issue 內容生成。

描述

When running the test suite on the Python 3.13.0 freethreading version (--without-gil), I'm getting the following test failures:

$ python -m pytest
========================================================= test session starts =========================================================
platform linux -- Python 3.13.0, pytest-8.3.3, pluggy-1.5.0
rootdir: /tmp/execnet
configfile: tox.ini
testpaths: testing
plugins: timeout-2.3.1
timeout: 20.0s
timeout method: signal
timeout func_only: False
collected 1095 items                                                                                                                  

testing/test_basics.py ...........................                                                                              [  2%]
testing/test_channel.py ..s...s...s...s...s...s...s...s...s...s...s...s...s...s...s...s...s...s...s.FFsF..s...s...s...s...s...s [ 11%]
...s...s...s...s.                                                                                                               [ 13%]
testing/test_gateway.py ..s...s...s...s...s...s.XXsX..s...s...s...s...s...s...s...s...s...s...s...s...s....ssss                 [ 21%]
testing/test_multi.py ..s.xX                                                                                                    [ 21%]
testing/test_termination.py ...xx                                                                                               [ 22%]
testing/test_threadpool.py ......x.......                                                                                       [ 23%]
testing/test_basics.py ...........                                                                                              [ 24%]
testing/test_channel.py ..s...s...s...s...s...s...s...s...s...s...s...s...s...s...s...s...s...s...s.FFsF..s...s...s...s...s...s [ 34%]
...s...s...s...s.                                                                                                               [ 35%]
testing/test_gateway.py ..s...s...s...s...s...s.XXsX..s...s...s...s...s...s...s...s...s...s...s...s...s....ss..                 [ 43%]
testing/test_multi.py ..s.xX                                                                                                    [ 44%]
testing/test_termination.py ...xx                                                                                               [ 44%]
testing/test_threadpool.py ......x.......                                                                                       [ 45%]
testing/test_basics.py sssssssssss                                                                                              [ 46%]
testing/test_channel.py sssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss [ 56%]
sssssssssssssssss                                                                                                               [ 57%]
testing/test_gateway.py sssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss                 [ 65%]
testing/test_multi.py ssssss                                                                                                    [ 66%]
testing/test_termination.py sssss                                                                                               [ 66%]
testing/test_threadpool.py ssssssssssssss                                                                                       [ 68%]
testing/test_basics.py sssssssssss                                                                                              [ 69%]
testing/test_channel.py sssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss [ 78%]
sssssssssssssssss                                                                                                               [ 80%]
testing/test_gateway.py sssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss                 [ 87%]
testing/test_multi.py ssssss                                                                                                    [ 88%]
testing/test_termination.py sssss                                                                                               [ 88%]
testing/test_threadpool.py ssssssssssssss                                                                                       [ 90%]
testing/test_basics.py ...................                                                                                      [ 91%]
testing/test_compatibility_regressions.py .                                                                                     [ 92%]
testing/test_gateway.py ........X.X.....ss                                                                                      [ 93%]
testing/test_multi.py ..............                                                                                            [ 94%]
testing/test_rsync.py ...........                                                                                               [ 95%]
testing/test_serializer.py ................                                                                                     [ 97%]
testing/test_termination.py ...                                                                                                 [ 97%]
testing/test_xspec.py ...............X....ssss.                                                                                 [100%]

============================================================== FAILURES ===============================================================
_____________________________ TestChannelBasicBehaviour.test_channel_callback_remote_freed[thread-popen] ______________________________

self = <test_channel.TestChannelBasicBehaviour object at 0x5d33e685f60>
gw = <Gateway id='popen' receive-live, thread model, 1 active channels>

    @needs_early_gc
    def test_channel_callback_remote_freed(self, gw: Gateway) -> None:
        channel = self.check_channel_callback_stays_active(gw, earlyfree=False)
        assert channel is not None
        # freed automatically at the end of producer()
>       channel.waitclose(TESTTIMEOUT)

testing/test_channel.py:255: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = <Channel id=49 open>, timeout = 10.0

    def waitclose(self, timeout: float | None = None) -> None:
        """Wait until this channel is closed (or the remote side
        otherwise signalled that no more data was being sent).
    
        The channel may still hold receiveable items, but not receive
        any more after waitclose() has returned.
    
        Exceptions from executing code on the other side are reraised as local
        channel.RemoteErrors.
    
        EOFError is raised if the reading-connection was prematurely closed,
        which often indicates a dying process.
    
        self.TimeoutError is raised after the specified number of seconds
        (default is None, i.e. wait indefinitely).
        """
        # wait for non-"opened" state
        self._receiveclosed.wait(timeout=timeout)
        if not self._receiveclosed.is_set():
>           raise self.TimeoutError("Timeout after %r seconds" % timeout)
E           execnet.gateway_base.TimeoutError: Timeout after 10.0 seconds

src/execnet/gateway_base.py:896: TimeoutError
-------------------------------------------------------- Captured stdout call ---------------------------------------------------------
99
98
97
96
95
94
93
92
91
90
89
88
87
86
85
84
83
82
81
_____________________________ TestChannelBasicBehaviour.test_channel_callback_remote_freed[thread-socket] _____________________________

self = <test_channel.TestChannelBasicBehaviour object at 0x5d33e685fb0>
gw = <Gateway id='socket' receive-live, thread model, 1 active channels>

    @needs_early_gc
    def test_channel_callback_remote_freed(self, gw: Gateway) -> None:
        channel = self.check_channel_callback_stays_active(gw, earlyfree=False)
        assert channel is not None
        # freed automatically at the end of producer()
>       channel.waitclose(TESTTIMEOUT)

testing/test_channel.py:255: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = <Channel id=49 open>, timeout = 10.0

    def waitclose(self, timeout: float | None = None) -> None:
        """Wait until this channel is closed (or the remote side
        otherwise signalled that no more data was being sent).
    
        The channel may still hold receiveable items, but not receive
        any more after waitclose() has returned.
    
        Exceptions from executing code on the other side are reraised as local
        channel.RemoteErrors.
    
        EOFError is raised if the reading-connection was prematurely closed,
        which often indicates a dying process.
    
        self.TimeoutError is raised after the specified number of seconds
        (default is None, i.e. wait indefinitely).
        """
        # wait for non-"opened" state
        self._receiveclosed.wait(timeout=timeout)
        if not self._receiveclosed.is_set():
>           raise self.TimeoutError("Timeout after %r seconds" % timeout)
E           execnet.gateway_base.TimeoutError: Timeout after 10.0 seconds

src/execnet/gateway_base.py:896: TimeoutError
-------------------------------------------------------- Captured stdout call ---------------------------------------------------------
99
98
97
96
95
94
93
92
91
90
89
88
87
86
85
84
83
82
81
_____________________________ TestChannelBasicBehaviour.test_channel_callback_remote_freed[thread-proxy] ______________________________

self = <test_channel.TestChannelBasicBehaviour object at 0x5d33e686050>
gw = <Gateway id='proxy' receive-live, thread model, 1 active channels>

    @needs_early_gc
    def test_channel_callback_remote_freed(self, gw: Gateway) -> None:
        channel = self.check_channel_callback_stays_active(gw, earlyfree=False)
        assert channel is not None
        # freed automatically at the end of producer()
>       channel.waitclose(TESTTIMEOUT)

testing/test_channel.py:255: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = <Channel id=49 open>, timeout = 10.0

    def waitclose(self, timeout: float | None = None) -> None:
        """Wait until this channel is closed (or the remote side
        otherwise signalled that no more data was being sent).
    
        The channel may still hold receiveable items, but not receive
        any more after waitclose() has returned.
    
        Exceptions from executing code on the other side are reraised as local
        channel.RemoteErrors.
    
        EOFError is raised if the reading-connection was prematurely closed,
        which often indicates a dying process.
    
        self.TimeoutError is raised after the specified number of seconds
        (default is None, i.e. wait indefinitely).
        """
        # wait for non-"opened" state
        self._receiveclosed.wait(timeout=timeout)
        if not self._receiveclosed.is_set():
>           raise self.TimeoutError("Timeout after %r seconds" % timeout)
E           execnet.gateway_base.TimeoutError: Timeout after 10.0 seconds

src/execnet/gateway_base.py:896: TimeoutError
-------------------------------------------------------- Captured stdout call ---------------------------------------------------------
99
98
97
96
95
94
93
92
91
90
89
88
87
86
85
84
83
82
81
________________________ TestChannelBasicBehaviour.test_channel_callback_remote_freed[main_thread_only-popen] _________________________

self = <test_channel.TestChannelBasicBehaviour object at 0x5d33e6860a0>
gw = <Gateway id='popen' receive-live, thread model, 1 active channels>

    @needs_early_gc
    def test_channel_callback_remote_freed(self, gw: Gateway) -> None:
        channel = self.check_channel_callback_stays_active(gw, earlyfree=False)
        assert channel is not None
        # freed automatically at the end of producer()
>       channel.waitclose(TESTTIMEOUT)

testing/test_channel.py:255: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = <Channel id=177 open>, timeout = 10.0

    def waitclose(self, timeout: float | None = None) -> None:
        """Wait until this channel is closed (or the remote side
        otherwise signalled that no more data was being sent).
    
        The channel may still hold receiveable items, but not receive
        any more after waitclose() has returned.
    
        Exceptions from executing code on the other side are reraised as local
        channel.RemoteErrors.
    
        EOFError is raised if the reading-connection was prematurely closed,
        which often indicates a dying process.
    
        self.TimeoutError is raised after the specified number of seconds
        (default is None, i.e. wait indefinitely).
        """
        # wait for non-"opened" state
        self._receiveclosed.wait(timeout=timeout)
        if not self._receiveclosed.is_set():
>           raise self.TimeoutError("Timeout after %r seconds" % timeout)
E           execnet.gateway_base.TimeoutError: Timeout after 10.0 seconds

src/execnet/gateway_base.py:896: TimeoutError
-------------------------------------------------------- Captured stdout call ---------------------------------------------------------
99
98
97
96
95
94
93
92
91
90
89
88
87
86
85
84
83
82
81
________________________ TestChannelBasicBehaviour.test_channel_callback_remote_freed[main_thread_only-socket] ________________________

self = <test_channel.TestChannelBasicBehaviour object at 0x5d33e6860f0>
gw = <Gateway id='socket' receive-live, thread model, 1 active channels>

    @needs_early_gc
    def test_channel_callback_remote_freed(self, gw: Gateway) -> None:
        channel = self.check_channel_callback_stays_active(gw, earlyfree=False)
        assert channel is not None
        # freed automatically at the end of producer()
>       channel.waitclose(TESTTIMEOUT)

testing/test_channel.py:255: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = <Channel id=173 open>, timeout = 10.0

    def waitclose(self, timeout: float | None = None) -> None:
        """Wait until this channel is closed (or the remote side
        otherwise signalled that no more data was being sent).
    
        The channel may still hold receiveable items, but not receive
        any more after waitclose() has returned.
    
        Exceptions from executing code on the other side are reraised as local
        channel.RemoteErrors.
    
        EOFError is raised if the reading-connection was prematurely closed,
        which often indicates a dying process.
    
        self.TimeoutError is raised after the specified number of seconds
        (default is None, i.e. wait indefinitely).
        """
        # wait for non-"opened" state
        self._receiveclosed.wait(timeout=timeout)
        if not self._receiveclosed.is_set():
>           raise self.TimeoutError("Timeout after %r seconds" % timeout)
E           execnet.gateway_base.TimeoutError: Timeout after 10.0 seconds

src/execnet/gateway_base.py:896: TimeoutError
-------------------------------------------------------- Captured stdout call ---------------------------------------------------------
99
98
97
96
95
94
93
92
91
90
89
88
87
86
85
84
83
82
81
________________________ TestChannelBasicBehaviour.test_channel_callback_remote_freed[main_thread_only-proxy] _________________________

self = <test_channel.TestChannelBasicBehaviour object at 0x5d33e686190>
gw = <Gateway id='proxy' receive-live, thread model, 1 active channels>

    @needs_early_gc
    def test_channel_callback_remote_freed(self, gw: Gateway) -> None:
        channel = self.check_channel_callback_stays_active(gw, earlyfree=False)
        assert channel is not None
        # freed automatically at the end of producer()
>       channel.waitclose(TESTTIMEOUT)

testing/test_channel.py:255: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = <Channel id=173 open>, timeout = 10.0

    def waitclose(self, timeout: float | None = None) -> None:
        """Wait until this channel is closed (or the remote side
        otherwise signalled that no more data was being sent).
    
        The channel may still hold receiveable items, but not receive
        any more after waitclose() has returned.
    
        Exceptions from executing code on the other side are reraised as local
        channel.RemoteErrors.
    
        EOFError is raised if the reading-connection was prematurely closed,
        which often indicates a dying process.
    
        self.TimeoutError is raised after the specified number of seconds
        (default is None, i.e. wait indefinitely).
        """
        # wait for non-"opened" state
        self._receiveclosed.wait(timeout=timeout)
        if not self._receiveclosed.is_set():
>           raise self.TimeoutError("Timeout after %r seconds" % timeout)
E           execnet.gateway_base.TimeoutError: Timeout after 10.0 seconds

src/execnet/gateway_base.py:896: TimeoutError
-------------------------------------------------------- Captured stdout call ---------------------------------------------------------
99
98
97
96
95
94
93
92
91
90
89
88
87
86
85
84
83
82
81
=============================================================== XPASSES ===============================================================
________________________________________________ TestTracing.test_popen_stderr_tracing ________________________________________________
-------------------------------------------------------- Captured stderr call ---------------------------------------------------------
[443074] gw0-worker [receiver-thread] received <Message GATEWAY_TERMINATE channel=0 lendata=0>
[443074] gw0-worker [receiver-thread] finishing receiving thread
[443074] gw0-worker [receiver-thread] terminating execution
[443074] gw0-worker shutting down execution pool
[443074] gw0-worker [receiver-thread] closing read
[443074] gw0-worker [serve] joining receiver thread
[443074] gw0-worker 1 channel.__del__
[443074] gw0-worker waiting for receiver thread to finish
[443074] gw0-worker [receiver-thread] closing write
[443074] gw0-worker [receiver-thread] terminating our receive pseudo pool
[443074] === atexit cleanup <Group []> ===
======================================================= short test summary info =======================================================
SKIPPED [2] testing/test_channel.py:20: no 'gspecs' option found
SKIPPED [2] testing/test_channel.py:25: no 'gspecs' option found
SKIPPED [2] testing/test_channel.py:29: no 'gspecs' option found
SKIPPED [2] testing/test_channel.py:37: no 'gspecs' option found
SKIPPED [2] testing/test_channel.py:43: no 'gspecs' option found
SKIPPED [2] testing/test_channel.py:50: no 'gspecs' option found
SKIPPED [2] testing/test_channel.py:63: no 'gspecs' option found
SKIPPED [2] testing/test_channel.py:69: no 'gspecs' option found
SKIPPED [2] testing/test_channel.py:74: no 'gspecs' option found
SKIPPED [2] testing/test_channel.py:79: no 'gspecs' option found
SKIPPED [2] testing/test_channel.py:87: no 'gspecs' option found
SKIPPED [2] testing/test_channel.py:95: no 'gspecs' option found
SKIPPED [2] testing/test_channel.py:105: no 'gspecs' option found
SKIPPED [2] testing/test_channel.py:120: no 'gspecs' option found
SKIPPED [2] testing/test_channel.py:133: no 'gspecs' option found
SKIPPED [2] testing/test_channel.py:158: no 'gspecs' option found
SKIPPED [2] testing/test_channel.py:175: no 'gspecs' option found
SKIPPED [2] testing/test_channel.py:193: no 'gspecs' option found
SKIPPED [2] testing/test_channel.py:211: no 'gspecs' option found
SKIPPED [2] testing/test_channel.py:250: no 'gspecs' option found
SKIPPED [2] testing/test_channel.py:257: no 'gspecs' option found
SKIPPED [2] testing/test_channel.py:274: no 'gspecs' option found
SKIPPED [2] testing/test_channel.py:288: no 'gspecs' option found
SKIPPED [2] testing/test_channel.py:311: no 'gspecs' option found
SKIPPED [2] testing/test_channel.py:326: no 'gspecs' option found
SKIPPED [2] testing/test_channel.py:334: no 'gspecs' option found
SKIPPED [2] testing/test_channel.py:348: no 'gspecs' option found
SKIPPED [2] testing/test_channel.py:364: no 'gspecs' option found
SKIPPED [2] testing/test_channel.py:372: no 'gspecs' option found
SKIPPED [2] testing/test_channel.py:385: no 'gspecs' option found
SKIPPED [2] testing/test_gateway.py:36: no 'gspecs' option found
SKIPPED [2] testing/test_gateway.py:42: no 'gspecs' option found
SKIPPED [2] testing/test_gateway.py:45: no 'gspecs' option found
SKIPPED [2] testing/test_gateway.py:50: no 'gspecs' option found
SKIPPED [2] testing/test_gateway.py:54: no 'gspecs' option found
SKIPPED [2] testing/test_gateway.py:70: no 'gspecs' option found
SKIPPED [2] testing/test_gateway.py:79: no 'gspecs' option found
SKIPPED [2] testing/test_gateway.py:101: no 'gspecs' option found
SKIPPED [2] testing/test_gateway.py:114: no 'gspecs' option found
SKIPPED [2] testing/test_gateway.py:147: no 'gspecs' option found
SKIPPED [2] testing/test_gateway.py:187: no 'gspecs' option found
SKIPPED [2] testing/test_gateway.py:198: no 'gspecs' option found
SKIPPED [2] testing/test_gateway.py:202: no 'gspecs' option found
SKIPPED [2] testing/test_gateway.py:206: no 'gspecs' option found
SKIPPED [2] testing/test_gateway.py:210: no 'gspecs' option found
SKIPPED [2] testing/test_gateway.py:215: no 'gspecs' option found
SKIPPED [2] testing/test_gateway.py:221: no 'gspecs' option found
SKIPPED [2] testing/test_gateway.py:232: no 'gspecs' option found
SKIPPED [2] testing/test_gateway.py:249: no 'gspecs' option found
SKIPPED [2] testing/test_gateway.py:266: no 'gspecs' option found
SKIPPED [2] testing/test_gateway.py:399: no 'gspecs' option found
SKIPPED [2] testing/test_gateway.py:402: no 'gspecs' option found
SKIPPED [1] testing/test_gateway.py:572: can only run with main_thread_only
SKIPPED [1] testing/test_gateway.py:611: can only run with main_thread_only
SKIPPED [2] testing/test_multi.py:23: no 'gspecs' option found
SKIPPED [2] testing/test_basics.py:180: could not import 'eventlet': No module named 'eventlet'
SKIPPED [2] testing/test_basics.py:188: could not import 'eventlet': No module named 'eventlet'
SKIPPED [1] testing/test_basics.py:203: could not import 'eventlet': No module named 'eventlet'
SKIPPED [1] testing/test_basics.py:254: could not import 'eventlet': No module named 'eventlet'
SKIPPED [1] testing/test_basics.py:296: could not import 'eventlet': No module named 'eventlet'
SKIPPED [1] testing/test_basics.py:334: could not import 'eventlet': No module named 'eventlet'
SKIPPED [1] testing/test_basics.py:340: could not import 'eventlet': No module named 'eventlet'
SKIPPED [1] testing/test_basics.py:346: could not import 'eventlet': No module named 'eventlet'
SKIPPED [1] testing/test_basics.py:350: could not import 'eventlet': No module named 'eventlet'
SKIPPED [4] testing/test_channel.py:20: could not import 'eventlet': No module named 'eventlet'
SKIPPED [4] testing/test_channel.py:25: could not import 'eventlet': No module named 'eventlet'
SKIPPED [4] testing/test_channel.py:29: could not import 'eventlet': No module named 'eventlet'
SKIPPED [4] testing/test_channel.py:37: could not import 'eventlet': No module named 'eventlet'
SKIPPED [4] testing/test_channel.py:43: could not import 'eventlet': No module named 'eventlet'
SKIPPED [4] testing/test_channel.py:50: could not import 'eventlet': No module named 'eventlet'
SKIPPED [4] testing/test_channel.py:63: could not import 'eventlet': No module named 'eventlet'
SKIPPED [4] testing/test_channel.py:69: could not import 'eventlet': No module named 'eventlet'
SKIPPED [4] testing/test_channel.py:74: could not import 'eventlet': No module named 'eventlet'
SKIPPED [4] testing/test_channel.py:79: could not import 'eventlet': No module named 'eventlet'
SKIPPED [4] testing/test_channel.py:87: could not import 'eventlet': No module named 'eventlet'
SKIPPED [4] testing/test_channel.py:95: could not import 'eventlet': No module named 'eventlet'
SKIPPED [4] testing/test_channel.py:105: could not import 'eventlet': No module named 'eventlet'
SKIPPED [4] testing/test_channel.py:120: could not import 'eventlet': No module named 'eventlet'
SKIPPED [4] testing/test_channel.py:133: could not import 'eventlet': No module named 'eventlet'
SKIPPED [4] testing/test_channel.py:158: could not import 'eventlet': No module named 'eventlet'
SKIPPED [4] testing/test_channel.py:175: could not import 'eventlet': No module named 'eventlet'
SKIPPED [4] testing/test_channel.py:193: could not import 'eventlet': No module named 'eventlet'
SKIPPED [4] testing/test_channel.py:211: could not import 'eventlet': No module named 'eventlet'
SKIPPED [4] testing/test_channel.py:250: could not import 'eventlet': No module named 'eventlet'
SKIPPED [4] testing/test_channel.py:257: could not import 'eventlet': No module named 'eventlet'
SKIPPED [4] testing/test_channel.py:274: could not import 'eventlet': No module named 'eventlet'
SKIPPED [4] testing/test_channel.py:288: could not import 'eventlet': No module named 'eventlet'
SKIPPED [4] testing/test_channel.py:311: could not import 'eventlet': No module named 'eventlet'
SKIPPED [4] testing/test_channel.py:326: could not import 'eventlet': No module named 'eventlet'
SKIPPED [4] testing/test_channel.py:334: could not import 'eventlet': No module named 'eventlet'
SKIPPED [4] testing/test_channel.py:348: could not import 'eventlet': No module named 'eventlet'
SKIPPED [4] testing/test_channel.py:364: could not import 'eventlet': No module named 'eventlet'
SKIPPED [4] testing/test_channel.py:372: could not import 'eventlet': No module named 'eventlet'
SKIPPED [4] testing/test_channel.py:385: could not import 'eventlet': No module named 'eventlet'
SKIPPED [4] testing/test_gateway.py:36: could not import 'eventlet': No module named 'eventlet'
SKIPPED [4] testing/test_gateway.py:42: could not import 'eventlet': No module named 'eventlet'
SKIPPED [4] testing/test_gateway.py:45: could not import 'eventlet': No module named 'eventlet'
SKIPPED [4] testing/test_gateway.py:50: could not import 'eventlet': No module named 'eventlet'
SKIPPED [4] testing/test_gateway.py:54: could not import 'eventlet': No module named 'eventlet'
SKIPPED [4] testing/test_gateway.py:70: could not import 'eventlet': No module named 'eventlet'
SKIPPED [4] testing/test_gateway.py:79: could not import 'eventlet': No module named 'eventlet'
SKIPPED [4] testing/test_gateway.py:101: could not import 'eventlet': No module named 'eventlet'
SKIPPED [4] testing/test_gateway.py:114: could not import 'eventlet': No module named 'eventlet'
SKIPPED [4] testing/test_gateway.py:147: could not import 'eventlet': No module named 'eventlet'
SKIPPED [4] testing/test_gateway.py:187: could not import 'eventlet': No module named 'eventlet'
SKIPPED [4] testing/test_gateway.py:198: could not import 'eventlet': No module named 'eventlet'
SKIPPED [4] testing/test_gateway.py:202: could not import 'eventlet': No module named 'eventlet'
SKIPPED [4] testing/test_gateway.py:206: could not import 'eventlet': No module named 'eventlet'
SKIPPED [4] testing/test_gateway.py:210: could not import 'eventlet': No module named 'eventlet'
SKIPPED [4] testing/test_gateway.py:215: could not import 'eventlet': No module named 'eventlet'
SKIPPED [4] testing/test_gateway.py:221: could not import 'eventlet': No module named 'eventlet'
SKIPPED [4] testing/test_gateway.py:232: could not import 'eventlet': No module named 'eventlet'
SKIPPED [4] testing/test_gateway.py:249: could not import 'eventlet': No module named 'eventlet'
SKIPPED [4] testing/test_gateway.py:266: could not import 'eventlet': No module named 'eventlet'
SKIPPED [1] testing/test_gateway.py:304: could not import 'eventlet': No module named 'eventlet'
SKIPPED [1] testing/test_gateway.py:323: could not import 'eventlet': No module named 'eventlet'
SKIPPED [1] testing/test_gateway.py:351: could not import 'eventlet': No module named 'eventlet'
SKIPPED [1] testing/test_gateway.py:399: could not import 'eventlet': No module named 'eventlet'
SKIPPED [1] testing/test_gateway.py:402: could not import 'eventlet': No module named 'eventlet'
SKIPPED [1] testing/test_gateway.py:568: could not import 'eventlet': No module named 'eventlet'
SKIPPED [1] testing/test_gateway.py:607: could not import 'eventlet': No module named 'eventlet'
SKIPPED [4] testing/test_multi.py:23: could not import 'eventlet': No module named 'eventlet'
SKIPPED [1] testing/test_multi.py:235: could not import 'eventlet': No module named 'eventlet'
SKIPPED [1] testing/test_multi.py:259: could not import 'eventlet': No module named 'eventlet'
SKIPPED [2] testing/test_termination.py:25: could not import 'eventlet': No module named 'eventlet'
SKIPPED [1] testing/test_termination.py:45: could not import 'eventlet': No module named 'eventlet'
SKIPPED [2] testing/test_termination.py:112: could not import 'eventlet': No module named 'eventlet'
SKIPPED [1] testing/test_threadpool.py:10: could not import 'eventlet': No module named 'eventlet'
SKIPPED [1] testing/test_threadpool.py:20: could not import 'eventlet': No module named 'eventlet'
SKIPPED [1] testing/test_threadpool.py:26: could not import 'eventlet': No module named 'eventlet'
SKIPPED [1] testing/test_threadpool.py:31: could not import 'eventlet': No module named 'eventlet'
SKIPPED [1] testing/test_threadpool.py:50: could not import 'eventlet': No module named 'eventlet'
SKIPPED [1] testing/test_threadpool.py:65: could not import 'eventlet': No module named 'eventlet'
SKIPPED [1] testing/test_threadpool.py:75: could not import 'eventlet': No module named 'eventlet'
SKIPPED [1] testing/test_threadpool.py:103: could not import 'eventlet': No module named 'eventlet'
SKIPPED [1] testing/test_threadpool.py:112: could not import 'eventlet': No module named 'eventlet'
SKIPPED [1] testing/test_threadpool.py:122: could not import 'eventlet': No module named 'eventlet'
SKIPPED [1] testing/test_threadpool.py:133: could not import 'eventlet': No module named 'eventlet'
SKIPPED [1] testing/test_threadpool.py:146: could not import 'eventlet': No module named 'eventlet'
SKIPPED [1] testing/test_threadpool.py:171: could not import 'eventlet': No module named 'eventlet'
SKIPPED [1] testing/test_threadpool.py:195: could not import 'eventlet': No module named 'eventlet'
SKIPPED [2] testing/test_basics.py:180: could not import 'gevent': No module named 'gevent'
SKIPPED [2] testing/test_basics.py:188: could not import 'gevent': No module named 'gevent'
SKIPPED [1] testing/test_basics.py:203: could not import 'gevent': No module named 'gevent'
SKIPPED [1] testing/test_basics.py:254: could not import 'gevent': No module named 'gevent'
SKIPPED [1] testing/test_basics.py:296: could not import 'gevent': No module named 'gevent'
SKIPPED [1] testing/test_basics.py:334: could not import 'gevent': No module named 'gevent'
SKIPPED [1] testing/test_basics.py:340: could not import 'gevent': No module named 'gevent'
SKIPPED [1] testing/test_basics.py:346: could not import 'gevent': No module named 'gevent'
SKIPPED [1] testing/test_basics.py:350: could not import 'gevent': No module named 'gevent'
SKIPPED [4] testing/test_channel.py:20: could not import 'gevent': No module named 'gevent'
SKIPPED [4] testing/test_channel.py:25: could not import 'gevent': No module named 'gevent'
SKIPPED [4] testing/test_channel.py:29: could not import 'gevent': No module named 'gevent'
SKIPPED [4] testing/test_channel.py:37: could not import 'gevent': No module named 'gevent'
SKIPPED [4] testing/test_channel.py:43: could not import 'gevent': No module named 'gevent'
SKIPPED [4] testing/test_channel.py:50: could not import 'gevent': No module named 'gevent'
SKIPPED [4] testing/test_channel.py:63: could not import 'gevent': No module named 'gevent'
SKIPPED [4] testing/test_channel.py:69: could not import 'gevent': No module named 'gevent'
SKIPPED [4] testing/test_channel.py:74: could not import 'gevent': No module named 'gevent'
SKIPPED [4] testing/test_channel.py:79: could not import 'gevent': No module named 'gevent'
SKIPPED [4] testing/test_channel.py:87: could not import 'gevent': No module named 'gevent'
SKIPPED [4] testing/test_channel.py:95: could not import 'gevent': No module named 'gevent'
SKIPPED [4] testing/test_channel.py:105: could not import 'gevent': No module named 'gevent'
SKIPPED [4] testing/test_channel.py:120: could not import 'gevent': No module named 'gevent'
SKIPPED [4] testing/test_channel.py:133: could not import 'gevent': No module named 'gevent'
SKIPPED [4] testing/test_channel.py:158: could not import 'gevent': No module named 'gevent'
SKIPPED [4] testing/test_channel.py:175: could not import 'gevent': No module named 'gevent'
SKIPPED [4] testing/test_channel.py:193: could not import 'gevent': No module named 'gevent'
SKIPPED [4] testing/test_channel.py:211: could not import 'gevent': No module named 'gevent'
SKIPPED [4] testing/test_channel.py:250: could not import 'gevent': No module named 'gevent'
SKIPPED [4] testing/test_channel.py:257: could not import 'gevent': No module named 'gevent'
SKIPPED [4] testing/test_channel.py:274: could not import 'gevent': No module named 'gevent'
SKIPPED [4] testing/test_channel.py:288: could not import 'gevent': No module named 'gevent'
SKIPPED [4] testing/test_channel.py:311: could not import 'gevent': No module named 'gevent'
SKIPPED [4] testing/test_channel.py:326: could not import 'gevent': No module named 'gevent'
SKIPPED [4] testing/test_channel.py:334: could not import 'gevent': No module named 'gevent'
SKIPPED [4] testing/test_channel.py:348: could not import 'gevent': No module named 'gevent'
SKIPPED [4] testing/test_channel.py:364: could not import 'gevent': No module named 'gevent'
SKIPPED [4] testing/test_channel.py:372: could not import 'gevent': No module named 'gevent'
SKIPPED [4] testing/test_channel.py:385: could not import 'gevent': No module named 'gevent'
SKIPPED [4] testing/test_gateway.py:36: could not import 'gevent': No module named 'gevent'
SKIPPED [4] testing/test_gateway.py:42: could not import 'gevent': No module named 'gevent'
SKIPPED [4] testing/test_gateway.py:45: could not import 'gevent': No module named 'gevent'
SKIPPED [4] testing/test_gateway.py:50: could not import 'gevent': No module named 'gevent'
SKIPPED [4] testing/test_gateway.py:54: could not import 'gevent': No module named 'gevent'
SKIPPED [4] testing/test_gateway.py:70: could not import 'gevent': No module named 'gevent'
SKIPPED [4] testing/test_gateway.py:79: could not import 'gevent': No module named 'gevent'
SKIPPED [4] testing/test_gateway.py:101: could not import 'gevent': No module named 'gevent'
SKIPPED [4] testing/test_gateway.py:114: could not import 'gevent': No module named 'gevent'
SKIPPED [4] testing/test_gateway.py:147: could not import 'gevent': No module named 'gevent'
SKIPPED [4] testing/test_gateway.py:187: could not import 'gevent': No module named 'gevent'
SKIPPED [4] testing/test_gateway.py:198: could not import 'gevent': No module named 'gevent'
SKIPPED [4] testing/test_gateway.py:202: could not import 'gevent': No module named 'gevent'
SKIPPED [4] testing/test_gateway.py:206: could not import 'gevent': No module named 'gevent'
SKIPPED [4] testing/test_gateway.py:210: could not import 'gevent': No module named 'gevent'
SKIPPED [4] testing/test_gateway.py:215: could not import 'gevent': No module named 'gevent'
SKIPPED [4] testing/test_gateway.py:221: could not import 'gevent': No module named 'gevent'
SKIPPED [4] testing/test_gateway.py:232: could not import 'gevent': No module named 'gevent'
SKIPPED [4] testing/test_gateway.py:249: could not import 'gevent': No module named 'gevent'
SKIPPED [4] testing/test_gateway.py:266: could not import 'gevent': No module named 'gevent'
SKIPPED [1] testing/test_gateway.py:304: could not import 'gevent': No module named 'gevent'
SKIPPED [1] testing/test_gateway.py:323: could not import 'gevent': No module named 'gevent'
SKIPPED [1] testing/test_gateway.py:351: could not import 'gevent': No module named 'gevent'
SKIPPED [1] testing/test_gateway.py:399: could not import 'gevent': No module named 'gevent'
SKIPPED [1] testing/test_gateway.py:402: could not import 'gevent': No module named 'gevent'
SKIPPED [1] testing/test_gateway.py:568: could not import 'gevent': No module named 'gevent'
SKIPPED [1] testing/test_gateway.py:607: could not import 'gevent': No module named 'gevent'
SKIPPED [4] testing/test_multi.py:23: could not import 'gevent': No module named 'gevent'
SKIPPED [1] testing/test_multi.py:235: could not import 'gevent': No module named 'gevent'
SKIPPED [1] testing/test_multi.py:259: could not import 'gevent': No module named 'gevent'
SKIPPED [2] testing/test_termination.py:25: could not import 'gevent': No module named 'gevent'
SKIPPED [1] testing/test_termination.py:45: could not import 'gevent': No module named 'gevent'
SKIPPED [2] testing/test_termination.py:112: could not import 'gevent': No module named 'gevent'
SKIPPED [1] testing/test_threadpool.py:10: could not import 'gevent': No module named 'gevent'
SKIPPED [1] testing/test_threadpool.py:20: could not import 'gevent': No module named 'gevent'
SKIPPED [1] testing/test_threadpool.py:26: could not import 'gevent': No module named 'gevent'
SKIPPED [1] testing/test_threadpool.py:31: could not import 'gevent': No module named 'gevent'
SKIPPED [1] testing/test_threadpool.py:50: could not import 'gevent': No module named 'gevent'
SKIPPED [1] testing/test_threadpool.py:65: could not import 'gevent': No module named 'gevent'
SKIPPED [1] testing/test_threadpool.py:75: could not import 'gevent': No module named 'gevent'
SKIPPED [1] testing/test_threadpool.py:103: could not import 'gevent': No module named 'gevent'
SKIPPED [1] testing/test_threadpool.py:112: could not import 'gevent': No module named 'gevent'
SKIPPED [1] testing/test_threadpool.py:122: could not import 'gevent': No module named 'gevent'
SKIPPED [1] testing/test_threadpool.py:133: could not import 'gevent': No module named 'gevent'
SKIPPED [1] testing/test_threadpool.py:146: could not import 'gevent': No module named 'gevent'
SKIPPED [1] testing/test_threadpool.py:171: could not import 'gevent': No module named 'gevent'
SKIPPED [1] testing/test_threadpool.py:195: could not import 'gevent': No module named 'gevent'
SKIPPED [2] testing/test_gateway.py:554: could not import 'gevent': No module named 'gevent'
SKIPPED [1] testing/test_xspec.py:199: no 'gspecs' option found
SKIPPED [1] testing/test_xspec.py:207: Vagrant binary not in PATH
SKIPPED [1] testing/test_xspec.py:228: no 'gspecs' option found
SKIPPED [1] testing/test_xspec.py:239: no 'gspecs' option found
XFAIL testing/test_multi.py::test_safe_terminate[thread] - active_count() has been broken for some time
XFAIL testing/test_termination.py::test_terminate_implicit_does_trykill[thread-sys.executable] - reason: since python3.12 this test triggers RuntimeError: can't create new thread at interpreter shutdown
XFAIL testing/test_termination.py::test_terminate_implicit_does_trykill[thread-pypy3] - reason: since python3.12 this test triggers RuntimeError: can't create new thread at interpreter shutdown
XFAIL testing/test_threadpool.py::test_limited_size[thread] - WorkerPool does not implement limited size
XFAIL testing/test_multi.py::test_safe_terminate[main_thread_only] - active_count() has been broken for some time
XFAIL testing/test_termination.py::test_terminate_implicit_does_trykill[main_thread_only-sys.executable] - reason: since python3.12 this test triggers RuntimeError: can't create new thread at interpreter shutdown
XFAIL testing/test_termination.py::test_terminate_implicit_does_trykill[main_thread_only-pypy3] - reason: since python3.12 this test triggers RuntimeError: can't create new thread at interpreter shutdown
XFAIL testing/test_threadpool.py::test_limited_size[main_thread_only] - WorkerPool does not implement limited size
XPASS testing/test_gateway.py::TestBasicGateway::test_gateway_status_busy[thread-popen] - on some systems this test fails due to timing problems
XPASS testing/test_gateway.py::TestBasicGateway::test_gateway_status_busy[thread-socket] - on some systems this test fails due to timing problems
XPASS testing/test_gateway.py::TestBasicGateway::test_gateway_status_busy[thread-proxy] - on some systems this test fails due to timing problems
XPASS testing/test_multi.py::test_safe_terminate2[thread] - active_count() has been broken for some time
XPASS testing/test_gateway.py::TestBasicGateway::test_gateway_status_busy[main_thread_only-popen] - on some systems this test fails due to timing problems
XPASS testing/test_gateway.py::TestBasicGateway::test_gateway_status_busy[main_thread_only-socket] - on some systems this test fails due to timing problems
XPASS testing/test_gateway.py::TestBasicGateway::test_gateway_status_busy[main_thread_only-proxy] - on some systems this test fails due to timing problems
XPASS testing/test_multi.py::test_safe_terminate2[main_thread_only] - active_count() has been broken for some time
XPASS testing/test_gateway.py::TestThreads::test_status_with_threads - on some systems this test fails due to timing problems
XPASS testing/test_gateway.py::TestTracing::test_popen_stderr_tracing - on some systems this test fails due to timing problems
XPASS testing/test_xspec.py::TestMakegateway::test_popen_nice - fails due to timing problems on busy single-core VMs
FAILED testing/test_channel.py::TestChannelBasicBehaviour::test_channel_callback_remote_freed[thread-popen] - execnet.gateway_base.TimeoutError: Timeout after 10.0 seconds
FAILED testing/test_channel.py::TestChannelBasicBehaviour::test_channel_callback_remote_freed[thread-socket] - execnet.gateway_base.TimeoutError: Timeout after 10.0 seconds
FAILED testing/test_channel.py::TestChannelBasicBehaviour::test_channel_callback_remote_freed[thread-proxy] - execnet.gateway_base.TimeoutError: Timeout after 10.0 seconds
FAILED testing/test_channel.py::TestChannelBasicBehaviour::test_channel_callback_remote_freed[main_thread_only-popen] - execnet.gateway_base.TimeoutError: Timeout after 10.0 seconds
FAILED testing/test_channel.py::TestChannelBasicBehaviour::test_channel_callback_remote_freed[main_thread_only-socket] - execnet.gateway_base.TimeoutError: Timeout after 10.0 seconds
FAILED testing/test_channel.py::TestChannelBasicBehaviour::test_channel_callback_remote_freed[main_thread_only-proxy] - execnet.gateway_base.TimeoutError: Timeout after 10.0 seconds
============================ 6 failed, 470 passed, 600 skipped, 8 xfailed, 11 xpassed in 105.58s (0:01:45) ============================

I've tried increasing the test timeout to 60 seconds (and disabling pytest-timeout), and this did not change the result. I've tested on 8e9da514ecc35c1bcc6399a365ede68c30321f75. GIL-enabled interpreter passes these tests on this system.

主要語言
Python
星號
103
分支
50
平均合併
5 天 12 小時
30 天內合併 PR
4

環境準備

這個專案沒有提供開發容器、Dockerfile 或貢獻指南,環境需要你自己搭建:先看它的 README,通用步驟見我們的新手貢獻指南。

從這裡開始

  1. 先讀完整個 Issue,再讀專案的貢獻指南。
  2. 在 Issue 下留言說明你要接手 —— 這能避免兩個人做同樣的事。
  3. Fork 儲存庫,在一個分支上完成修改。
  4. 送出 Pull Request,並在描述裡引用這個 Issue 編號。

pytest-dev/execnet 的其他 Issue

查看 pytest-dev/execnet 的全部 Issue

相似的 Issue

更多 Python Issue

把新 issue 寄到你的電子郵件信箱

精選適合新手參與的 GitHub issue 摘要。