concurrent.futures and asyncio.futures

asyncio.Future(*, loop=None)
几乎兼容concurrent.futures.Future
  • result()并且exception()不要接受超时参数,并且在未来还没有完成时引发异常。
  • add_done_callback()始终通过事件循环的调用注册到的回调call_soon_threadsafe()。
  • 此类与包中的wait()和as_completed()函数不兼容concurrent.futures
此类不是线程安全的

基本上,如果您使用ThreadPoolExecutorProcessPoolExecutor,或者想Future直接Direct用于基于线程或基于进程的并发,
请使用
concurrent.futures.Future如果您正在使用asyncio,请使用asyncio.Future
asyncio.Future根本不是线程安全的-仅设计用于asyncio基于单线程的应用程序。
如果您想asyncio.Future从事件循环线程之外的线程上调用方法,则需要使用loop.call_soon_threadsafe

 

'''
# asyncio orm + 同步mysql(使用concurrent 来结合两者)
'''
import time
import asyncio


def func():
    '''同步耗时操作'''
    time.sleep(2)
    return 'ok'


async def main():
    loop = asyncio.get_running_loop()

    fut = loop.run_in_executor(None, func)
    # 1、运行默认的executor (thread) ,调用submit方法申请一个县城区执行一个func函数,并返回一个concurrent.futures.Future对象
    # 2、调用asyncio.warp_future对上面对象进行封装
    result = await fut

    print(result)


asyncio.run(main())

 

posted @ 2020-05-21 21:31  慕沁  阅读(215)  评论(0)    收藏  举报