pytest-dev / execnet

distributed Python deployment and communication
https://execnet.readthedocs.io
MIT License
81 stars 42 forks source link

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

Open mgorny opened 1 month ago

mgorny commented 1 month ago

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

```pytb $ 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 = gw = @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 = , 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 = gw = @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 = , 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 = gw = @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 = , 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 = gw = @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 = , 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 = gw = @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 = , 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 = gw = @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 = , 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 [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 === ======================================================= 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.

RonnyPfannschmidt commented 1 month ago

We haven't done any research on how lack of gil affects the internal communication primitives for excecnet