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 件 担当者 0 名 GitHub で見る

まだ誰も着手していません。

主要言語
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. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

調査の方向性

testing/test_channel.py::TestChannelBasicBehaviour::test_channel_callback_remote_freed から始め、示されている pytest コマンドを使って Python 3.13.0 freethreading で再現します。src/execnet/gateway_base.py の Channel.waitclose() 周辺と報告されたタイムアウトを調査し、その後、影響を受けるゲートウェイで callback 関連のチャネルがタイムアウトせずに閉じることを確認します。

索引モデルが issue の本文から書いたものです。

評価

技術スタック
python
領域
distributed-systems
issue の種類
バグ
難易度
3/5
見積もり時間
1〜2日
活発さ
停滞
明瞭さ
おおむね明確
初心者へのやさしさ
45/100

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。