Send asyncio tasks to loop running in other thread

后端 未结 1 1825
挽巷
挽巷 2020-12-13 18:54

How can I asynchronously insert tasks to run in an asyncio event loop running in another thread?

My motivation is to support interactive asynchronous wo

相关标签:
1条回答
  • 2020-12-13 19:48

    You must use call_soon_threadsafe to schedule callbacks from different threads:

    import asyncio
    from threading import Thread
    
    loop = asyncio.new_event_loop()
    
    def f(loop):
        asyncio.set_event_loop(loop)
        loop.run_forever()
    
    t = Thread(target=f, args=(loop,))
    t.start()    
    
    @asyncio.coroutine
    def g():
        yield from asyncio.sleep(1)
        print('Hello, world!')
    
    loop.call_soon_threadsafe(asyncio.async, g())
    

    See https://docs.python.org/3/library/asyncio-dev.html#asyncio-multithreading for more information.

    EDIT: Example of an interpreter supporting asynchronous workloads

    # vim: filetype=python3 tabstop=2 expandtab
    
    import asyncio as aio
    import random
    
    @aio.coroutine
    def async_eval(input_, sec):
      yield from aio.sleep(sec)
      print("")
      try:
        result = eval(input_)
      except Exception as e:
        print("< {!r} does not compute >".format(input_))
      else:  
        print("< {!r} = {} >".format(input_, result))
    
    @aio.coroutine
    def main(loop):
      while True:
        input_ = yield from loop.run_in_executor(None, input, "> ")
    
        if input_ == "quit":
          break
        elif input_ == "":
          continue
        else:
          sec = random.uniform(5, 10)
          print("< {!r} scheduled for execution in {:.02} sec>".format(input_, sec))
          aio.async(async_eval(input_, sec))
    
    loop = aio.get_event_loop()
    
    loop.run_until_complete(main(loop))
    loop.close()
    
    0 讨论(0)
提交回复
热议问题