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