进程、线程、协程

进程

1.代码执行,经过Process创建子进程,并且运行后,主进程的变量和内存都自动copy一份,子进程进行使用,但是代码本身并不copy,只有在子进程需要(经过特殊方法)对代码进行修改时,代码才会被copy。因此,进程之间不共享全局变量。

2. 进程创建

`import multiprocessing`

`p = multiprocessing.Process(函数名)` 子进程指向该函数

`p.start()`

`p.join([overtime])` 等待子进程p结束,或者传入参数超时时间,意思是等待一定的时间后强制结束该子进程。

`p.terminate() ` 不管子进程是否执行结束,立即终止子进程。

 

进程池

`import multiprocessing`

`po = multiprocessing.Pool(n)` 创建一个有n个进程的进程池

`po.apply_async(函数名,(参数,))` 进程池po指向的函数,并启动

`po.close()` 进程池关闭,不在接收新进程。

`po.join()` 等待进程池的进程全部结束,如果不写的话,主进程到此处不会等待子进程,主进程首先结束。

进程间通信方式

1.socket

2.先把信息写在硬盘的文件里,另外一个进程再从硬盘里读取

3.q队列

`q = Queue(数量)` 创建一个一定数量的队列

`q.put(a)` 把a放入队列

`q.get(a)` 把a从队列里拿出来

 

 

线程

代码从上往下执行,通过threading模块创建子线程去独立执行某一块单独的代码,达到提升程序运行的效果。

创建线程

1、import threading

2、t = threading.Thread(target=函数名,args=(参数,)) args中参数传递的格式

时元组,因此当函数又一个函数时,注意在参数后面加个逗号。

3、t.start() 启动子线程

 

python多线程中会共享全局变量,如果有多个线程同时对全局变量进行操作时,会产生错误,为了避免这种错误,引入了锁的概念。

python中的线程实际上是假的多任务,但产生的原因并不是python语言本身,而是python官方的c语言解释器的原因,虽然这个现象时真实存在的,但多线程依然可以加快程序运行速度,当然没有真丶多线程快。想要使python的多线程变为真的,可以换成Jpython解释器,或者发挥python胶水语言的特性,在线程部分由其他语言来写,在python中一样可以使用。

协程

迭代器

拥有`__iter__`,`__next__`,两个方法的类

生成器

不同函数中加入`yield`语句就变成一个生成器

 

gevent

`g1 = gevent.spawn(函数名,参数)` 创建协成对象,此时协程并未开始执行,协程只有遇到延时语句时才会启动

`g1.join()` 等待g1执行结束,是一种延时,此时协程启动

使用gevent进行协程多任务的时候,代码中的延时操作必须使用gevent中的延时代码,增加了`monkey.patch_all()`,可以实现延时代码自动切换至gevent中的延时代码

 

 

 

进程和线城的区别

1. 进程占用资源比线城多

2.线城共享资源,进程不共享资源,进程间通信需要用到队列q

3.主线程死亡,子线程同时死亡;主进程死亡,子进程同时死亡。

 

 

进程、线程和协程的区别

1.进程是资源分配的单位,真正执行代码的是线程,操作系统真正调度的是线程。

2.进程没有线程效率高,进程占用资源多,线程占用资源少,比线程更少的是协程。

3.协程依赖于线程、线程依赖于进程,进程一死线程必挂,线程一挂协程必死。

4.一般不用多进程,可以考虑使用多线程,如果多线程里面有很多网络请求,网络可能会有堵塞,此时用协程比较合适。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值