I wrote a script to non-blocking reading binary data from stdin like this: import sys, threading def _thread(): data = sys.stdin.buffer.readline() thread = threading.Thread(target=_thread) thread.daemon = True thread.start() and the output is like this: Fatal Python error: could not acquire lock for <_io.BufferedReader name=''> at interpreter shutdown, possibly due to daemon threads Thread 0x00007faf54ebf700 (most recent call first): File "pipetcpadapter.py", line 8 in func File "/usr/lib/python3.5/threading.py", line 862 in run File "/usr/lib/python3.5/threading.py", line 914 in _bootstrap_inner File "/usr/lib/python3.5/threading.py", line 882 in _bootstrap Current thread 0x00007faf566da700 (most recent call first): Aborted (core dumped)
16.2.4.3. Multi-threading FileIO objects are thread-safe to the extent that the operating system calls (such as read(2) under Unix) they wrap are thread-safe too. Binary buffered objects (instances of BufferedReader, BufferedWriter, BufferedRandom and BufferedRWPair) protect their internal structures using a lock; it is therefore safe to call them from multiple threads at once. >>>> TextIOWrapper objects are not thread-safe. <<<< Maybe problem here?
The problem is that Py_FinalizeEx() tries to close the sys.stdin object in _PyImport_Cleanup(), but closing the buffered object requires the object lock which is hold by _thread(). _thread() is blocked on waiting for a newline character. I suggest to use non-blocking read in a loop, to be able to properly stop your thread at Python exit. You may want to give a try using the asyncio module. Python works as expected. I don't see any bug here. I close the issue.
History
Date
User
Action
Args
2022-04-11 14:58:25
admin
set
github: 70225
2020-03-09 11🔞22
vstinner
set
status: open -> closednosy: + vstinnermessages: + resolution: not a bugstage: resolved