Futex hang when running event loop on a separated thread
Marc Aymerich
glicerinu at gmail.com
Tue Nov 24 10:46:15 EST 2015
On Tue, Nov 24, 2015 at 4:29 PM, Marc Aymerich <glicerinu at gmail.com> wrote:
> Hi,
>
> I have to run the asyncio.loop on a separated thread because the main
> thread is running FUSE. Apparently fuse needs to run on the main
> thread because it uses signal():
>
> ....
> File "/usr/local/lib/python3.4/dist-packages/fuse.py", line 390, in __init__
> old_handler = signal(SIGINT, SIG_DFL)
> ValueError: signal only works in main thread
>
>
> Anyway, when I exit the program it appears that i run into a deadlock
> with the eventloop thread, strace is stuck with:
>
> ....
> futex(0x7f7ba0000c10, FUTEX_WAIT_PRIVATE, 0, NULL
>
>
> I've tried to stop the event loop from the main thread but the
> situation is exactly the same :(
>
> loop_container = {}
> handler = threading.Thread(target=run_loop, args=(loop_container,))
> try:
> handler.start()
> FUSE(fs)
> finally:
> loop_container['loop'].stop()
> # handler.join()
>
> Any idea on how I can shutdown the hole thing? I have to manually kill
> the program each time :(
this can be reproduced with the following program:
import asyncio
import threading
import time
def run_loop(loop_container):
loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
coro = asyncio.start_server(lambda: 1, '0.0.0.0', 8888, loop=loop)
server = loop.run_until_complete(coro)
loop_container['loop'] = loop
loop.run_forever()
if __name__ == '__main__':
loop_container = {}
handler = threading.Thread(target=run_loop, args=(loop_container, ))
handler.start()
try:
time.sleep(10000)
finally:
loop_container['loop'].stop()
glic3 at XPS13:/tmp$ python3 /tmp/eventtest.py
^CTraceback (most recent call last):
File "/tmp/eventtest.py", line 22, in <module>
time.sleep(10000)
KeyboardInterrupt
^CException ignored in: <module 'threading' from
'/usr/lib/python3.4/threading.py'>
Traceback (most recent call last):
File "/usr/lib/python3.4/threading.py", line 1294, in _shutdown
t.join()
File "/usr/lib/python3.4/threading.py", line 1060, in join
self._wait_for_tstate_lock()
File "/usr/lib/python3.4/threading.py", line 1076, in _wait_for_tstate_lock
elif lock.acquire(block, timeout):
KeyboardInterrupt
it is waiting for tstate_lock in the second ^C
--
Marc
More information about the Python-list
mailing list