1多进程:
像要了解多进程,首先就要先了解概念:程序、进程、线程。
#1个.py文件就可以叫:程序 是静态概念
#进程: 一个分配资源的基本单位,是一个程序运行及分配到它手上的资源的统称
#线程: 运行进程进行动作的基本单位
那么我们来写一个简单的多进程:
import os
import multiprocessing
def work():
for i in range(5):
print('work1',i)
print('当前进程:',multiprocessing.current_process().pid) #获取当前进程编号
print('父进程id:',os.getppid()) #ppid是父进程,pid是当前进程
if __name__ == '__main__':
process = multiprocessing.Process(target=work) #主进程里创建子进程
process.start()
print('当前进程编号:',os.getpid())
2多进程之间的通信:
多进程之间,或者说进程之间,全局变量不共享,所以需要有一个第三方通道来传递参数,使进程间实现通信,也就是实现变量共享
#用消息队列,来进行多进程之间通信
import multiprocessing
if __name__ == '__main__':
queue = multiprocessing.Queue(maxsize=3) #空间存三条
#向队列里面放入消息
queue.put('hello')
queue.put(1)
queue.put([1,2,3])
# queue.put({'a':1},timeout=1) #(要传的参数,溢出时间)
print(queue)
print(queue.get())
print(queue.get())
print(queue.get())
print(queue.get(timeout=1)) #一共只存了三条消息,所以导出第四条是导不出的,但是搜索不到就一直卡在搜索那里,所以设置一个溢出时间,超过时间的放弃执行此次搜索,返回错误
3多进程之间通过文件通信:
我们现在知道,进程之间是不共享全局变量的,我们要让他共享,就得进程通信,那么不用queue这个函数,我们还可以怎么实现通信呢?没错,就是可以通过文件来通信。queue实质上也只是提供了一个类似保管平台一样的东西,使的变量通过这个平台来传递参数,甲传给乙,甲本来就知道变量是多少,乙收到,也知道了变量是多少,这样一来,双方都知道变量了,换个说法,也就是实现了双方的信息共享,也就是通信了
# 通过文件来进行多进程间通信
import multiprocessing
def write(wenjan,data):
f = open(wenjan,'w')
# f.seek(0)
# f.truncate() # 清空文件
f.write(data)
f.close()
def read(wenjian):
g=open(wenjian,'r')
nei_rong = g.read()
# g.truncate()
g.close()
print('内容是:',nei_rong)
if __name__ == '__main__':
data = input('请输入要传递数据:')
# queue = multiprocessing.Queue(maxsize=5)
wenjian = '123.text'
t1 = multiprocessing.Process(target=write,args=(wenjian,data))
t2 = multiprocessing.Process(target=read,args=(wenjian,))
t1.start()
t1.join()
t2.start()
4 进程池:
# 进程池是由多个子进程组成,使用程序创建子进程
def a(index):
print(index)
print(os.getpid()) #查看进程id
time.sleep(2)
import os
import time
import multiprocessing
if __name__ == '__main__':
pool = multiprocessing.Pool(3) #创建进程池(一次可以用三个子进程)
for i in range(10):
pool.apply_async(a,(5,)) #非阻塞方式调用(调用好会释放池子里的进程(进程id:x,进程id:y,进程id:z) , 进程(进程id:x,进程id:y,进程id:z)可以重新被利用)
pool.close() #关闭池子,不接受任务
pool.join() #池子操作完成后,join是用来执行参数代码,然后再运行主进程