Python中的多进程创建和传值(克隆)Queue方法

今日怼人金句“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()

猜你喜欢

转载自blog.csdn.net/dreamingcrazy/article/details/81807121
今日推荐