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