并发编程
基本概念的区分:
-
并发 只有一个CPU,多个程序在一个CPU上轮流执行,宏观上多个进程并发执行,但微观上依旧是串行 -
并行 有多个CPU,多个程序在多个CPU上同时执行。 -
进程 计算机中最小的资源分配单位,占用资源,需要操作系统进行调度,每一个程序就是一个进程,其中使用pid作为进程间的唯一标识。 -
线程 线程必须存在于进程中,不能独立存在,不占用资源,是能够被计算机独立运行和独立调度的最小单位 ,一个进程中可以有多个线程,但至少有一个 -
同步 在事件A执行过程中发起事件B,只有B结束,A才能继续执行,需要等结果 -
异步 在事件A执行过程中发起事件B,不需要B结束,A可以继续执行,不需要等结果
进程并发:
#全局执行
from multiprocessing import Process #多进程模块
import os
def fun(name,*args):
print(name,os.getpid(),os.getppid())
print('全局执行')
if __name__ == '__main__':#因此此处也终止了死循环
#只在主进程下执行的代码
print('main:',os.getpid(), os.getppid()) #整个程序的主进程,和父进程
print('只在主进程执行')
p = list()
proc1 = Process(target=fun,args=("lisi",)) #传参
print('开启子进程lisi')
proc1.start() #在当前的主进程又创建了一个子进程,当前进程既为子进程又为父进程
p.append(proc1)
proc2 = Process(target=fun, args=('wangwu',)) # 传参
print('开启子进程wangwu')
proc2.start() #异步非阻塞状态
# p.terminate()#强制结束一个子进程
# p.daemon =True #变为守护进程,直到主进程的代码结束,才结束
p.append(proc2)
for i in p: i.join() #同步阻塞;直到proc1,proc2进程都执行完,才继续执行
print('全部子进程执行完毕')
执行结果:
全局执行
main: 19028 10944
只在主进程执行
开启子进程lisi
开启子进程wangwu
全局执行
全局执行
lisi 7820 19028
wangwu 20068 19028
全部子进程执行完毕
- 进程间的通信(ICP inter process communication)
– 基于文件通信:同一台机器上的多个进程间通信 如:socket基于文件级别的进程间数据通信(Queue队列) – 基于网络通信:一台或多台机器上的多个进程间的通信 借助一些第三方工具,消息中间件,如:redis,kafka等
from multiprocessing import Process,Queue
def func(q):
q.put('hello')
if __name__ == '__main__':
q = Queue() #共享数据的队列
proc1 = Process(target=func,args=(q,))
proc1.daemon = True
proc1.start()
print(q.get())
执行结果:
hello
|