今日怼人金句“OMG,你何时有这样高尚的想法了”(一般怼和你谈道德、良心的人)
先说什么是进程,进程按照笔者的理解就是空间+任务不对记得指正笔者,比如有一个公司(进程)里有员工在做不同的事(线程)。
好啦概念了,我们先说要用的包multiprocessing,记得要和线程的threading进行区分,笔者认为(可能也是笔者接触的比较浅 的缘故)
先来基本使用
简单的进程
import multiprocessing#导入多进程包,
import os#为了体现出多进程引入os包,
def work(num):
for n in range(num):
print('work1',n)
print(multiprocessing.current_process().pid)#current_process获取当前进程方法,pid为id号
print(os.getppid())#返回父进程的id
if __name__ == '__main__':
t1 = multiprocessing.Process(target=work,args=(999,))
t1.start()
print(os.getppid())#返回父进程的id
是不是和threading的用法很像?
附两张Process和Thread函数的初始化init方法的图吧,注意看传入值,和值的类型
Process
Thread
接下来我们来说一下多线程之间如何进行数据共享,不过进程中不共享全局变量,我们怎么办呢?我们克隆数据不就好了吗!(机智)我们将数据复制(克隆)后传递到B进程中,那么我们如何实现它呢?我们学习一个新的方法Queue方法
Queue方法
我们先来看代码
import multiprocessing
def puts(queue):
queue.put("今天又是丧丧的一天呢")#简单的理解为put传入数据
if __name__ == '__main__':
queue = multiprocessing.Queue(maxsize=10)#Queue方法设置最大传输字节数,maxsize可以不加,但是括号里一定要写数值否则无法实现
for n in range(5):
t1 = multiprocessing.Process(target=puts,args=(queue,))
t1.start()
t1.join()
print(queue.get())#接收传入值,如果get后无()则输出地址
首先,一定要在程序运行前声明引用该方法。
Queue方法括号里为最大传输字节数,如果不写程序不会报错默认限制为-1,笔者理解为默认传输字节数(所以大家最好还是设定值)
get后如果没有()则接收地址,有()则接收数据
那么就又有问题了,假如要传输put大于maxsize呢?怎么办?这时就用到了timeout
Queue方法中的timeout
timeout设置了接收时间,如果时间到了还没有接收到则停止上一接收(get)将空间给此get运行。
看代码吧
import multiprocessing
if __name__ == '__main__':
queue = multiprocessing.Queue(maxsize=3)#进程之间的通信,maxsize=最大传输数
# 向队列里面放入消息
queue.put('hello')
queue.put(1)
queue.put([1,2,3])
# queue.put({'a':1},timeout=0.1)
print(queue)
print(queue.get())
print(queue.get())
print(queue.get())
print(queue.get(timeout=1))#注意添加位置,这样会报一个错误,我们可以抓取错误,然后执行我们想要的。
注意添加位置,这样会报一个错误,我们可以抓取错误,然后执行我们想要的 。
错误
附另一个实例
实例:
import multiprocessing
# 写数据任务
def write(queue):
for i in range(10):
if queue.full():
print('已经满员,不能再存')
break
queue.put(i)
# 读取任务
def read(queue):
while True:
if queue.empty():
print('没有值啦')
break
print(queue.get())
if __name__ == '__main__':
queue = multiprocessing.Queue(5)
t1 = multiprocessing.Process(target=write,args=(queue,))
t2 = multiprocessing.Process(target=read,args=(queue,))
t1.start()
t1.join()
t2.start()