苏州网站制作及推广,做水处理药剂的公司网站,网站页面建设方案书模板,站长工具怎么关闭并发编程#xff08;不是并行#xff09;目前有四种方式#xff1a;多进程、多线程、协程和异步。
多进程编程在python中有类似C的os.fork,更高层封装的有multiprocessing标准库多线程编程python中有Thread和threading异步编程在linux下主要有三种实现select#xff0c;po…并发编程不是并行目前有四种方式多进程、多线程、协程和异步。
多进程编程在python中有类似C的os.fork,更高层封装的有multiprocessing标准库多线程编程python中有Thread和threading异步编程在linux下主要有三种实现selectpollepoll协程在python中通常会说到yield关于协程的库主要有greenlet,stackless,gevent,eventlet等实现。
进程
不共享任何状态调度由操作系统完成有独立的内存空间上下文切换的时候需要保存栈、cpu寄存器、虚拟内存、以及打开的相关句柄等信息开销大通讯主要通过信号传递的方式来实现实现方式有多种信号量、管道、事件等通讯都需要过内核效率低
线程
共享变量解决了通讯麻烦的问题但是对于变量的访问需要加锁调度由操作系统完成由于共享内存上下文切换变得高效一个进程可以有多个线程每个线程会共享父进程的资源创建线程开销占用比进程小很多可创建的数量也会很多通讯除了可使用进程间通讯的方式还可以通过共享内存的方式进行通信通过共享内存通信比通过内核要快很多
协程
调度完全由用户控制一个线程进程可以有多个协程每个线程进程循环按照指定的任务清单顺序完成不同的任务当任务被堵塞时执行下一个任务当恢复时再回来执行这个任务任务间切换只需要保存任务的上下文没有内核的开销可以不加锁的访问全局变量协程需要保证是非堵塞的且没有相互依赖协程基本上不能同步通讯多采用异步的消息通讯效率比较高
总结
进程拥有自己独立的堆和栈既不共享堆亦不共享栈进程由操作系统调度线程拥有自己独立的栈和共享的堆共享堆不共享栈线程亦由操作系统调度(标准线程是的)协程和线程一样共享堆不共享栈协程由程序员在协程的代码里显示调度
聊聊协程
协程又称微线程纤程。 Python的线程并不是标准线程是系统级进程线程间上下文切换有开销而且Python在执行多线程时默认加了一个全局解释器锁GIL因此Python的多线程其实是串行的所以并不能利用多核的优势也就是说一个进程内的多个线程只能使用一个CPU。
传统的生产者-消费者模型是一个线程写消息一个线程取消息通过锁机制控制队列和等待但容易死锁。 如果改用协程生产者生产消息后直接通过yield跳转到消费者开始执行待消费者执行完毕后切换回生产者继续生产效率极高。