您好,欢迎来到百家汽车网。
搜索
您的当前位置:首页Python_并发编程(线程,进程,协程)

Python_并发编程(线程,进程,协程)

来源:百家汽车网

1.串行(serial):一个CPU上,按顺序完成多个任务

2.并行(parallelism):指的是任务数小于等于cpu核数,即任务真的是一起执行的并发(concurrency):一个CPU采用时间片管理方式,交替的处理多个任务。一般是是任务数多余cpu核数,通过操作系统的各种任务调度算法,实现用多个任务“一起”执行(实际上总有一些任务不在执行,因为切换任务的速度相当快,看上去一起执行而已)

乔布斯想开工厂生产手机,费劲力气,制作一条生产线,这个生产线上有很多的器件以及材料。一条生产线就是一个进程。只有生产线是不够的,所以找五个工人来进行生产,这个工人能够利用这些材料最终一步步的将手机做出来,这五个工人就是五个线程。为了提高生产率,想到3种办法:1一条生产线上多招些工人,一起来做手机,这样效率是成倍増长,即单进程多线程方式2多条生产线,每个生产线上多个工人,即多进程多线程乔布斯深入一线发现工人不是那么忙,有很多等待时间。于是规定:如果某个员工在等待生产线某个零件生产时,不要闲着,干点其他工作。也就是说:如果一个线程等待某些条件,可以充分利用这个时间去做其它事情,这就是:协程方式。

1线程是程序执行的最小单位,而进程是操作系统分配资源的最小单位;

2一个进程由一个或多个线程组成,线程是一个进程中代码的不同执行路线;进程之间相互,但同一进程下的各个线程之间共享程序的内存空间(包括代码段、数据集、堆等)及一些进程级的资源(如打开文件和信号),某进程内的线程在其它进程不可见;

3调度和切换:线程上下文切换比进程上下文切换要快得多。进程(Process):拥有自己的堆和栈,既不共享堆,也不共享栈,进程由操作系统调度;进程切换需要的资源很最大,效率低线程(Thread):拥有自己的栈和共享的堆,共享堆,不共享栈,标准线程由操作系统调度;线程切换需要的资源一般,效率一般(当然了在不考虑GIL的情况下)协程(coroutine):拥有自己的栈和共享的堆,共享堆,不共享栈,协程由程序员在协程的代码里显示调度;协程切换任务资源很小,效率高进程是什么?进程(Process)是一个具有一定功能的程

线程是什么?线程(Thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。有些进程还不止同时干一件事,比如微信,它可以同时进行打字聊天,视频聊天,朋友圈等事情。在一个进程内部,要同时干多件事,就需要同时运行多个“子任务”,我们把进程内的这些“子任务”称为线程(Thread)。

并发编程解决方案:多任务的实现有3种方式:

1多进程模式

2多线程模式

3多进程+多线程模式启动多个进程,每个进程虽然只有一个线程,但多个进程可以一块执行多个任务启动一个进程,在一个进程内启动多个线程,这样,多个线程也可以一块执行多个任务启动多个进程,每个进程再启动多个线程,这样同时执行的任务就更多了,当然这种模型更复杂,实际很少采用。

协程是什么?协程,Coroutines,也叫作纤程(Fiber),是一种在线程中,比线程更加轻量级的存在,由程序员自己写程序来管理。当出现IO阻塞时,CPU一直等待IO返回,处于空转状态。这时候用协程,可以执行其他任务。当IO返回结果后,再回来处理数据。充分利用了IO等待的时间,提高了效率。

同步和异步介绍同步和异步强调的是消息通信机制(synchronous communication/asynchronous communication)。同步(synchronous):A调用B,等待B返回结果后,A继续执行异步(asynchronous ):A调用B,A继续执行,不等待B返回结果;B有结果了,通知A,A再做处理。

     

   

    

   

死锁的解决方法死锁是由于“同步块需要同时持有多个锁造成”的,要解决这个问题,思路很简单,就是:同一个代码块,不要同时持有两个对象锁。

   

进程的优缺点进程的优点:1可以使用计算机多核,进行任务的并行执行,提高执行效率2运行不受其他进程影响,创建方便3空间,数据安全进程的缺点:进程的创建和删除消耗的系统资源较多进程的创建方式(方法模式)Python的标准库提供了个模块:multiprocessing进程的创建可以通过分为两种方式:1.方法包装2.类包装创建进程后,使用start()启动进程

进程的创建方式(继承Process类)和使用Thread类创建子线程的方式非常类似,使用Process类创建实例化对象,其本质是调用该类的构造方法创建新进程。Process类的构造方法格式如下:def __init__(self,group=None,target=None,name=None,args=(),kwargs={})其中,各个参数的含义为:group:该参数未进行实现,不需要传参;

target:为新建进程指定执行任务,也就是指定一个函数;name:为新建进程设置名称;args:为target参数指定的参数传递非关键字参数;kwargs:为target参数指定的参数传递关键字参数。

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- baijiahaobaidu.com 版权所有 湘ICP备2023023988号-9

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务