pytest-dev / pytest-dev/execnet

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

Abierto
#306 1 comentario 0 reacciones 0 asignados Ver en GitHub

Nadie ha tomado este issue todavía.

Lenguaje dominante
Python
Estrellas
102
Forks
47
Métricas de merge de PR
Sin PR fusionados en 30 d

Descripción

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.

Guía de contribución

No hay ninguna guía de contribución indexada para este repositorio

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Línea de trabajo

Comienza con testing/test_channel.py::TestChannelBasicBehaviour::test_channel_callback_remote_freed y reprodúcelo en Python 3.13.0 freethreading con el comando de pytest mostrado. Inspecciona src/execnet/gateway_base.py alrededor de Channel.waitclose() y del timeout informado; después, verifica que el canal relacionado con el callback se cierre para los gateways afectados sin producir un timeout.

Escrito por el modelo de indexación a partir del texto del issue.

Evaluación

Stack tecnológico
python
Área
distributed-systems
Tipo de issue
Error
Dificultad
3/5
Tiempo estimado
1-2 días
Estado de actividad
Estancado
Claridad
Bastante claro
Aptitud para principiantes
45/100

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.