Python多线程Python有真正的多线程吗?我以为没有。因为CPython解释器本身不是线程安全的,所以有一个全局解释器锁(GIL),它只允许一次使用一个线程执行Python字节码。也就是说,即使Python是多线程的,也会受到GIL的限制,顺序执行。于是想到Python没有多线程,即一个Python进程不能同时使用多个CPU核。但是,Python标准库中所有执行阻塞I/O操作的函数在等待操作系统返回结果时释放GIL,让其他线程运行。这意味着Python线程仍然可以在I/O密集型应用程序中发挥作用。例如,当一个Python线程正在等待网络响应时,阻塞I/O函数将释放GIL并运行另一个线程。再比如time.sleep()函数也会释放GIL。Python多进程但是对于CPU密集型应用程序,如果要使用所有可用的CPU内核,则必须使用多进程来避免GIL。多线程与多处理何时使用多线程?什么时候使用多处理?I/O密集型应用程序使用多线程,CPU密集型应用程序使用多处理。什么是I/O密集型应用程序?什么是CPU密集型应用程序?简单来说,I/O密集型一般涉及网络和磁盘IO。而CPU密集型指的是更多的计算。要创建多个线程,可以使用concurrent.futures,要创建多个进程,可以使用multiprocessing。与多线程和协程相比,多线程有切换开销。同时,为了避免写变量冲突,在控制共享资源时需要加锁,这样写程序会比较复杂和困难。协程是通过单线程实现并发,可以自由切换,不需要锁机制,执行效率高很多。多线程和协程的一个共同点是,由于GIL的限制,它们只对I/O密集型应用程序有效。如果要处理CPU密集型应用程序,可以将其与多个进程结合使用,以提高CPU使用率。asyncio包asyncio包主要用于实现Python协程并发。原书在这一章引用了很多例子,穿插了很多代码,看得我有点乱。我不知道如何使用这个包。于是看了一下官方文档:https://docs.python.org/3/library/asyncio.html从Python3.5开始引入async和await,替换了@asyncio.coroutine和yieldfrom语法,语义更简洁更多清楚地。并且从Python3.7开始引入了asyncio.run()来代替这串代码:loop=asyncio.get_event_loop()try:loop.run_until_complete(main())finally:loop.close()创建任务的语法还有一个变化,可以使用asyncio.create_task:asyncdefcoro():...#InPython3.7+task=asyncio.create_task(coro())...#ThisworksinallPythonversionsbutislessreadabletask=asyncio.ensure_future(coro())...对于多个并行任务可以使用asyncio.gather而不是asyncio.wait:task_list=[]foriinrange(5):task=asyncio.create_task(async_func(i))task_list.append(task)done,pending=awaitasyncio。wait(task_list,timeout=None)fordone_taskindone:print((f[{current_time()}]获取执行结果{done_task.result()}"))task_list=[]foriinrange(5):task=asyncio.create_task(func(i))task_list.append(task)results=awaitasyncio.gather(*task_list)forresultinresults:print((f[{current_time()}]gettheexecutionresult{result}"))所以对于third的学习-派对套餐,最好看看t最新的官方文档,可能做了很多优化。最后,结束,撒花。
