专栏首页Python 学习day39(多进程) - 管道、进程池、进程池的返回值、进程回调函数、进程之间的数据共享
原创

day39(多进程) - 管道、进程池、进程池的返回值、进程回调函数、进程之间的数据共享

1.管道.py (了解,基本都是用队列比较多)

from multiprocessing import Pipe  # 管道
from multiprocessing import Process
from multiprocessing import Lock
import time
import random


def consumer(produce_obj, consume_obj, name, lock_obj):  # 消费进程函数
    produce_obj.close()  # 对于消费函数,上来就可以直接关闭 produce
    while True:
        lock_obj.acquire()  # 加锁,防止多个进程同时取数据导致数据的不安全性
        time.sleep(random.random())
        food = consume_obj.recv()  # 接受数据
        lock_obj.release()  # 释放锁
        if food:
            print('%s收到了%s' % (name, food))
        else:
            consume_obj.close()  # 表示没有数据可以接受了,关闭consume
            break


def producer(produce_obj, consume_obj, name, number):  # 生产者函数
    consume_obj.close()  # 对于生产者函数,上来就可以直接关闭
    for i in range(number):
        time.sleep(random.random())
        f = name + '做了包子' + str(i)
        produce_obj.send(f)
        print(f)

    produce_obj.send(None)
    produce_obj.send(None)
    produce_obj.close()


if __name__ == '__main__':
    produce, consume = Pipe()  # 管道,接受俩参数   pro传数据,  consume 接受数据
    lock = Lock()  # 基于管道的不安全性,创建一把锁,保证子进程不能同时接受数据造成数据传递和丢失之间的混乱
    p1 = Process(target=producer, args=(produce, consume, '老干妈', 30))
    c1 = Process(target=consumer, args=(produce, consume, '张三', lock))
    c2 = Process(target=consumer, args=(produce, consume, '李四', lock))
    p1.start()
    c1.start()
    c2.start()
    produce.close()  # 主进程关闭参数
    consume.close()

2.进程池以及进程池的返回值

# 返回结果先 append 进列表,否则变成了单进程

from multiprocessing import Process
from multiprocessing import Pool
import os
import time


# 进程池: 事儿来了马上就做,进程数量固定

def action(ele):
    print('进程号', os.getpid(), '正在', ele)
    time.sleep(5)
    return ele + '做完了'


if __name__ == '__main__':
    pool = Pool(3)
    li = []
    # 3个进程都来执行这个函数
    work_list = ['吃饭', '跑步', '读书', '写字', '唱歌', '做饭', '洗衣', '划水', '骑车', '练剑']
    for item in work_list:
        # 接受返回值
        res = pool.apply_async(action, args=(item,))
        li.append(res)

    # 必须 close(),否则报错
    # 给进程池任务分配完成
    # 可以理解为车子装货完成,发车了,关闭了车门
    pool.close()

    # 必须 join()
    # 主进程必须等待进程池完成,否则进程池不执行
    pool.join()

    # 打印返回值
    for item in li:
        print(item.get())

3.进程的回调函数

from multiprocessing import Pool


def func_1(n):
    print('in func_1')
    return n * n


def func_2(m):
    print('func_2:', m)


if __name__ == '__main__':
    p = Pool(5)
    for i in range(10):
        p.apply_async(func_1, args=(10,), callback=func_2)  # callback函数,将func_1的返回值给fun_2使用
    p.close()
    p.join()

4.进程之间的数据共享之 Manager

from multiprocessing import Process
from multiprocessing import Manager
from multiprocessing import Lock


def action(num, dic_data, lock_obj):
    lock_obj.acquire()
    dic_data['num'] -= num
    print(dic_data)
    lock_obj.release()


if __name__ == '__main__':
    p_list = []
    # Manage 对象的字典,数据所有的进程都可以修改
    dic = Manager().dict({'num': 101})
    lock = Lock()
    for i in range(100):
        # 起 100 个进程
        p = Process(target=action, args=(1, dic, lock))
        p.start()
        p_list.append(p)

    for p in p_list:
        p.join()

    # 程序的最后打印这个值
    print('-->', dic)

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • SALalchemy增删改查

    少年包青菜
  • day38(多进程) - 信号量、事件、进程队列(进程之间的通信)

    # 进程 A 将 event.clear()之后,进程 B 遇到 wait() 立即进入阻塞

    少年包青菜
  • day81-<权限组件>-基本流程以及部分代码

    少年包青菜
  • Python面向对象6:​isinstance、super、有序字典

    1、isinstance(对象名,类),查看对象是不是类的实例。 案例1:isinstance(对象名,类) classFoo: print('hh') obj...

    企鹅号小编
  • xml与数据库中数据的导入导出

    这是我一个晚上做出来的,因为要去做其他的项目,所以只实现了对特定数据库的xml操作,不过我觉得这是学习xml挺不错的参考代码和文档

    用户1208223
  • HTML5-类库系列 类名的各种操作

    HTML5学堂:最近讲师团队在学习JS类库的知识,因此就跟大家一起共享一下类库的搭建吧。今天要讲解的功能是:类名的各种操作。在这里,HTML5学堂提醒各位,不要...

    HTML5学堂
  • springboot mybatis优雅的添加多数据源

    springboot的原则是简化配置,本文试图不通过xml配置,使用configuration配置数据源,并进行简单的数据访问。 并且配置了多数据源,在开发过程...

    用户1225216
  • Angular开发者手册重点翻译之指令(一)文本和属性绑定ngAttr属性绑定

    创建自定义的指令 这个文章将解释什么需要在自己的angularjs应用中创建自己的指令,以及如何实现它。 什么是指令 在高的层面上讲,指令是DOM元素中的标记...

    小白哥哥
  • 给moco API添加random功能

    使用moco API快速搭建测试挡板服务的时候,有一些接口需求是随机返回固定的几个响应体,但是moco API提供并未提供此功能,幸好有先前增加limit功能的...

    八音弦
  • Java编程思想第五版(On Java8)(二十四)-并发编程

    到目前为止,我们一直在编程,就像文学中的意识流叙事设备一样:首先发生一件事,然后是下一件事。我们完全控制所有步骤及其发生的顺序。如果我们将值设置为5,那么稍后会...

    JavaEdge

扫码关注云+社区

领取腾讯云代金券