pytest-dev / pytest-dev/execnet

`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。

主要语言
Python
星标
102
派生
47
PR 合并指标
30 天内没有已合并 PR

描述

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.

贡献指南

这个仓库没有索引到贡献指南

从这里开始

  1. 先读完整个 Issue,再读项目的贡献指南。
  2. 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
  3. Fork 仓库,在一个分支上完成修改。
  4. 提交 Pull Request,并在描述里引用这个 Issue 编号。

调研方向

从 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 内容生成。

评估

技术栈
python
领域
distributed-systems
Issue 类型
缺陷
难度
3/5
预计耗时
1-2 天
活跃度
停滞
描述清晰度
基本清楚
新手友好度
45/100

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。