python多进程
并发:是指系统具有处理多个任务(动作)的能力(CPU通过切换来完成并发),并发是并行的一个子集。
并行:是指系统具有同时处理多个任务(动作)的能力
进程与线程:
一个任务就是一个进程,比如打开一个浏览器,打开一个qq 也是一个进程。 ,程序的所有数据资源都是存放在这里的。进程是最小的资源管理单元
线程是基于进程的,一个进程至少有1个线程,代码是在线程中执行线程是最小的执行单元,比如你发消息,发送文件等操作,都是线程去操作的。
线程是共享进程的内存单元的,所以多个线程实现资源共享。
一个线程可以创建或撤销另外一个线程,那么这个线程被称为父线程。另
同一个进程中的多个线程可以并发执行(存在cpu切换),不可以并行执行。这是因为,python存在全局解释器锁,在某个时刻,一个应用程序只有1个线程可以使用cpu。
1,创建多进程
import multiprocessing import threading import time def worker(id,interval): print('start work {0}'.format(id)) time.sleep(interval) print('end work {0}'.format(id)) def main(): print('start main') p1 = multiprocessing.Process(target=worker,args=(1,1)) p2 = multiprocessing.Process(target=worker,args=(2,2)) p3 = multiprocessing.Process(target=worker,args=(3,3)) p1.start() # print(p1.pid) p2.start() # print(p2.pid) p3.start() # print(p3.pid) print('end main') if __name__ == '__main__': main()
'''
target 指的是新派生出来的子进程需要处理的内容
args 是给函数传入的参数,args必须是tuple.如果是传入单个元素,必须也是tuple.
p代表的是一个多进程,run表示启动进程,start也是启动进程,他本质是调用run方法。建议使用start
p.is_alive() 判断进程是否存活
p.run() 启动进程
p.name() 输出进程的名字
p.pid() 进程的pid
p.join(timeout) 等待子进程结束或者到超时时间
p.terminate 强制子进程的退出
'''
import multiprocessing import threading import time def worker(id,interval): print('start work {0}'.format(id)) time.sleep(interval) print('end work {0}'.format(id)) def main(): print('start main') p1 = multiprocessing.Process(target=worker,args=(1,1)) p2 = multiprocessing.Process(target=worker,args=(2,2)) p3 = multiprocessing.Process(target=worker,args=(3,3)) p1.start() p1.join(1) #等待p1进程执行1s,不管p1执行是否完毕,代码继续向下执行。 p2.start() p3.start() for p in multiprocessing.active_children(): #查看当前存活的进程 print(p.name) print('end main') if __name__ == '__main__': main()
二,python多进程锁
import multiprocessing import time # from multiprocessing import Lock def add2(lock,number,value): with lock: print('start add2') print('number is {0}'.format(number)) for i in range(value): number+=value time.sleep(0.3) print('number is {0}'.format(number)) def add3(lock,number,value): lock.acquire() try: print('start add3') print('number is {0}'.format(number)) for i in range(value): number+=value time.sleep(0.3) print('number is {0}'.format(number)) except Exception as e: raise e finally: lock.release() def main(): lock = multiprocessing.Lock() p1 = multiprocessing.Process(target=add2,args=(lock,1,2)) p2 = multiprocessing.Process(target=add3,args=(lock,1,3)) p1.start() p2.start() if __name__ == '__main__': main() '''创建进程锁,如果不创建锁的话,输出的顺序比较乱'''
三,多进程设置共享内存,A进程变量共享给B进程
#!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2018/5/21 下午11:39 # @Author : lin # @File : daemon4.py import multiprocessing import time from multiprocessing import Value def add1(number,value): print('start add1') print('number is {0}'.format(number.value)) for i in range(value): number.value+=value # time.sleep(0.3) print('number is {0}'.format(number.value)) def add3(number,value): print('start add3') print('number is {0}'.format(number.value)) for i in range(value): number.value+=value # time.sleep(0.3) print('number is {0}'.format(number.value)) def main(): p1 = multiprocessing.Process(target=add1,args=(number,1,)) p2 = multiprocessing.Process(target=add3,args=(number,3,)) p1.start() p2.start() if __name__ == '__main__': # 设置共享内存 number=Value('d',0) main()