并发编程多任务
高并发:CPU核数很少,但是进程很多
高并行:CPU的核实要比进程数量一致,进程同时运行
多进程
程序:程序是一个指定的集合
进程:正在执行的程序
程序开始运行时,首先会创建一个主进程
在主进程下,我们可以创建新的进程,子进程依赖于主进程
Python提供了非常好用的多进程包multiprocessing
#name表示进程名
Process(func,name,args)
from multiprocessing import Process
def fun():
print("123")
def fun1(name):
print("456")
if __name__=="__main__":
p1 = Process(target=fun) # 创建进程
p1.start() # 执行进程
p1.join() # 主进程等待子进程执行完成
p2 = Process(target=fun1, args=("test",)) # 传递给函数参数
p2.start()
p2.join()
# 123
# 456
Process类常用方法
p.start() #启动进程,并调用该子进程中的p.run()
p.run() #进程启动时运行的方法,调用target指定的函数,自定义的类的类中一定要实现该方法
p.terminate() #强制终止进程,但是不会回收垃圾
p.is_alive() #如果p仍然运行,返回True,用来判断进程是否在运行
p.join([timeout]) #主进程等待子进程执行完毕,可以设置等待时间
#常用属性
name #进程的名字
pid #进程的ID
from multiprocessing import Process
num=1
def fun1():
global num
num+=1 #导入主进程的num变量,但是变量是独立的
print("进程1:%d" % num)
def fun2():
global num
num+=10 #导入主进程的num变量,但是变量是独立的
print("进程2:%d" % num)
if __name__ == '__main__':
p1= Process(target=fun1)
p2=Process(target=fun2)
p1.start() #两个子进程同时执行
p2.start()
p1.join()
p2.join()
# 进程2:11
# 进程1:2
通过类的方式来创建进程
from multiprocessing import Process
import time
#通过类继承的方式来创建要运行的进程
class test_process(Process):
def run(self):
n = 5
while n>=0:
print(n,end=" ")
time.sleep(1)
n-=1
if __name__ == '__main__':
p = test_process()
p.start()
p.join()
#5 4 3 2 1 0
使用进程池创建多个进程
#multiprocessing.Pool常用函数解析
apply_async() #使用非阻塞方式调用func
apply() #使用阻塞方式调用func
close() #关闭pool,不再接受新的任务
terminate() #不管任务是否完成,立即终止
join() #主进程阻塞,等待子进程的退出,必须在close或terminate后使用
from multiprocessing import Pool
def func(num):
print(num,end=" ")
if __name__ == '__main__':
p = Pool() #创建进程池,参数为同时可执行进程的数量
for i in range(20):
p.apply_async(func, args=(i,)) #创建20个进程,进程会同时执行
p.close()
p.join()
# 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END
暂无评论内容