Futex hang when running event loop on a separated thread
Marc Aymerich
glicerinu at gmail.com
Tue Nov 24 15:17:02 EST 2015
On Tue, Nov 24, 2015 at 8:41 PM, Zachary Ware
<zachary.ware+pylist at gmail.com> wrote:
> On Tue, Nov 24, 2015 at 12:37 PM, Marc Aymerich <glicerinu at gmail.com> wrote:
>> still it appears to work only if the main thread is in the foreground
>> (as of calling Thread() with deamon=True), I don't get why it behaves
>> differently :( maybe it is waiting for other stuff, but no idea how to
>> confirm this with strace of other means.. i always see the same
>> 'futex(0x7f9a70000c10, FUTEX_WAIT_PRIVATE, 0, NULL'
>
> What's your exact version of Python? asyncio is still evolving
> rapidly, and may behave differently between patch releases (say,
> between 3.4.1 and 3.4.3).
>
> I have tried out your reproducer with my fix, and I can't provoke a
> hang using Python 3.4.3 on either OSX or Ubuntu Trusty. Can you give
> some more specific directions to reproduce?
>
> --
> Zach
> --
> https://mail.python.org/mailman/listinfo/python-list
Yep, I'm a bit lost about how fuse implements going into background...
so the only way I have to reproduce this so far is by using fuse :(
# pip3 install fusepy
import asyncio
import threading
import time
import os
import sys
from fuse import FUSE, Operations
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__':
mountpoint = sys.argv[1]
loop_container = {}
handler = threading.Thread(target=run_loop, args=(loop_container,))
handler.start()
try:
# with foreground=True works
FUSE(Operations(), mountpoint, foreground=False)
finally:
loop_container['loop'].call_soon_threadsafe(loop_container['loop'].stop)
$ mkdir /tmp/7777
$ python3.5 /tmp/eventtest.py /tmp/7777
# Another terminal
$ ps aux | grep python3.5
glic3 19983 0.5 0.1 215540 10772 ? Ssl 21:05 0:00
python3.5 me.py /tmp/7777
$ sudo strace -p 19983
Process 19983 attached - interrupt to quit
futex(0x7fff42affca0, FUTEX_WAIT_PRIVATE, 0, NULL) = 0
# Here i fire
$ fusermount -u /tmp/7777
tgkill(19983, 19985, SIGRTMIN) = 0
futex(0x7fff42affc30, FUTEX_WAKE_PRIVATE, 1) = 0
futex(0x7f9840afc9d0, FUTEX_WAIT, 19984, NULL
I've just tried with python3.5 and the same behavior. The thing is
that with foreground=True it just works.
thank you for your time!
--
Marc
More information about the Python-list
mailing list