前言下面我举一个简单的例子来理解什么是同步异步,什么是阻塞和非阻塞。(不想了解这些基本概念的同学可以直接跳过。)例子来自知乎:给书店老板打电话问他有没有这本书《分布式系统》。如果是同步机制,书店老板检查后会马上告诉你(返回结果);如果是异步机制,书店店主会先挂断电话(先不返回结果),查完再给你回电话(callback)。还是一样的例子。打电话给书店老板,问他有没有这本书《分布式系统》。如果是blockingcall,你会一直守在电话里什么都不做,直到boss告诉你结果;如果是非阻塞调用,你先自己玩,偶尔看看老板有没有回复你。同步和异步更关注消息的通信机制(行为方式),而阻塞和非阻塞更关注程序在等待调用结果时的状态。Multi-process&Multi-thread进程是系统独立调度和分配系统资源(CPU、内存)的基本单元。系统可以开启多个进程(最大同时开启进程数与机器CPU数相同),执行多个任务。在Python3.2之前,多处理|threading模块用于编写多进程、多线程的代码,然后对其进行抽象封装,提供concurrent.futures模块。ProcessPoolExecutor|ThreadPoolExecutor里面是用来创建多进程多线程代码的。重要概念Exectuor:是任务的抽象类,提供异步执行方法(submit、map)Future:Executor返回的异步操作的实例进程池代码实现importtimefromconcurrent.futuresimportProcessPoolExecutordeftask(task_id):time.sleep(1)print(f'nowis{task_id}')returntask_idif__name__=='__main__':start=time.time()cpu_count=multiprocessing.cpu_count()withProcessPoolExecutor()作为p:futures=[p.submit(task,i)foriinrange(cpu_count)]print([future.result()forfuturesinfutures])print(time.time()-start)#Result:#现在是0#现在是2#nowis1#nowis3#[0,1,2,3]#1.3288664817810059线程池代码不需要切换上下文实现多线程,所以此时线程池会稍微快一些importtimefromconcurrent.futuresimportThreadPoolExecutordeftask(task_id):time.sleep(1)print(f'nowis{task_id}')returntask_idif__name__=='__main__':start=time.time()withThreadPoolExecutor()asp:futures=[p.submit(task,i)foriinrange(5)]print([future.result()forfuturesinfutures])print(time.time()-start)#结果:#现在是1#现在是0#现在是4#现在是3#现在是2#[0,1,2,3,4]#1.0025899410247803GIL&Co这里Cheng会提到GIL,这是Python中的一个常见问题。GIL是全局解释器锁。为了线程安全,Python在多线程执行时引入了全局锁,保证同一时刻只有一个线程在执行,100个tick后切换,这对I/O密集型程序的执行影响不大,但对于CPU密集型程序无疑限制了执行效率。所以Python后来反映了协程Coroutine。协程是用户态的轻量级线程。协程的作用是在执行函数A时,可以随时中断执行函数B,然后切换函数A,实现多任务异步执行。代码示例:importasyncio#定义一个协程(可以随时执行,随时切换的生成器)asyncdeftask(i):print(f'start{i}task')awaitasyncio.sleep(1)print(f'end{i}task')loop=asyncio.get_event_loop()#获取事件循环对象,可以将函数注册到事件中,满足条件则调用对应的函数tasks=[task(i)foriinrange(3)]#任务对象loop.run_until_complete(asyncio.wait(tasks))#执行协程任务#Result:#start1task#start2task#start0task#end1task#end2task#end0任务参考https://cuiqingcai.com/6160.htmlhttps://www.cnblogs.com/hucho...https://www.zhihu.com/questio...
