```python
from functools import partial
import asyncio
from threadpool_executor_shrink_able import ThreadPoolExecutorShrinkAble # 没有使用内置的 concurrent.futures里面的,这个是优化4点功能的。
global_threadpool_executor = ThreadPoolExecutorShrinkAble(200) # 这个是智能线程池,不是官方的concurrent.futures.threadpoolexecutor
async def simple_run_in_executor(f, *args, async_loop=None, threadpool_executor=None, **kwargs):
"""
函数的目的是转化任何同步方法或函数为异步链路语法中的一环。例如你写一个功能,要调用10个包,其中有9个有对应的异步库,有一个还没有对应的异步库,
因为一旦异步需要处处异步,不能因为某一个功能没有对应的异步库就前功尽弃。本函数就能够做到一个异步的链路里面调用同步库但不阻塞整个asyncio的loop循环。
这个函数看起来很简单,主要是调用官方的 run_in_executor 。
第1个特点是由官方的 方法改成了现在的函数 (方法是类里面面的,函数是模块下面的,我一般这么划分python方法和函数)
第2个特点是直接内置了线程池,用户可以无需传参了。并且这个线程池功能比官方的线程池要好,可以设置一个很大的值,他会自适应自动扩大缩小。
第3个特点是最重要的提高了易用性的地方。使用了整体偏函数把所有入参和函数生成一个偏函数,进而解决了官方只支持位置入参,不支持关键字入参的,
当函数入参达到几十个时候,例如requests.get 如果你想设置timeout参数,如果不支持关键字入参,你需要把timeout参数之前的其他不重要参数全都传递一遍使用默认None来占位。
函数入参个数比较多的情况下,不支持关键字入参就会很容易导致传参错误。
:param f: 任意同步阻塞函数,是非 async def的函数
:param args: 同步函数的入参
:param async_loop: loop
:param threadpool_executor: 在项城市里面运行。
:param kwargs: 同步函数的入参
:return: 同步函数的结果
"""
loopx = async_loop or asyncio.get_event_loop()
executor = threadpool_executor or global_threadpool_executor
result = await loopx.run_in_executor(executor, partial(f, *args, **kwargs))
return result
```
评论区