On Tue, Nov 24, 2015 at 4:29 PM, Marc Aymerich <glicer...@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@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 -- https://mail.python.org/mailman/listinfo/python-list