多进程(一)

有个人解释的很好,看下去

什么是进程?有什么用?——ok,那我问你,你能一手画圆一手画方吗?——我猜不能。但计算机就不一样了,一边绘制正方体一边绘制球体都是小case(屏幕上自动绘制图形),这是因为计算机启动了另一个"大脑"来处理另一个任务,即两个“大脑”分别同时画两个图形 效率X2!我们之前的写程序都是计算机一个“大脑”在工作!ok,那怎么启动计算机其他的大脑呢?——启动另一个进程就可以了!

1、创建进程:(直接复制粘贴运行对照输出。。)

import multiprocessing
import time

def action(a, b):  # 待会两个进程要执行的任务↓
    for i in range(30):  # 循环30次
        print(a, ' ', b)
        time.sleep(0.1)  # 等待0.1s

if __name__ == '__main__':  # 这行代码很重要,新建进程的时候都加上它!!

    # 准备建立一个进程:multiprocessing.Process()
    jc1 = multiprocessing.Process(target=action, args=('进程一', 0))
    # 再准备建立一个新进程,这是基本格式记住←
    jc2 = multiprocessing.Process(target=action, args=('进程二', 1))
    # 必要参数target:指定进程要执行的任务(这里是执行函数 action),必要参数args:直译成中文就是'参数',
    # 顾名思义就是前面target的参数,即action的参数,注意args是个元组,所以args后的参数写成tuple元组格式。
    # 直接写target('进程一',0)一定报错的

    jc1.start()  # 将蓄势待发的jc1进程正式启动!!
    jc2.start()  # 同上...

    jc1.join()  # 等待进程jc1将任务执行完...
    jc2.join()  # ...
    print('jc1,jc2任务都已执行完毕')

    jc1.close()  # 彻底关闭进程jc1
    jc2.close()  # ...

结果是 两个进程同时且连续打印0、1

进程一   0
进程二   1
进程一   0
进程二   1
Traceback (most recent call last):
  File "F:/machine_learning/TensorFlow/廖雪峰/多进程.py", line 112, in <module>
jc1,jc2任务都已执行完毕
    jc1.close()  # 彻底关闭进程jc1
AttributeError: 'Process' object has no attribute 'close'

最后不知道那报错

2进程池

# 主进程(父进程)全程干了什么?创建进程池、启动子进程、关闭进程池、等待子进程完毕、打印最后一行
import time
import os
from multiprocessing import Pool

def action1(a, b=50):
    for i in range(b):
        print(a, os.getpid(), ' ', i)  # os.getpid(): pid简单来说就是每个进程的“身份证”
        time.sleep(0.1)

if __name__ == '__main__':  # 还要添加这行,否则可能出现异常

    ci = Pool(3)  # 创建一个进程池,容量为3个进程
    ci.apply_async(action1, args=('进程一',))  # 启动第一个子进程...
    ci.apply_async(action1, args=('进程二', 50))  # 和普通进程的启动方式有很大不同仔细看
    ci.apply_async(action1, args=('进程三', 60))  # Pool的最基本格式记住←
# 注意:程序现在有4个进程在运行:上面的三个子进程 和一个最为核心的:主进程

    ci.close()  # 关闭进程池(但池子内已启动的子进程还会继续进行)
    ci.join()  # 等待进程池内的所有子进程完毕
    print('比如说这最后的一行输出就是主进程执行任务打印出来的')

3进程之间的通信

"""
进程之间的通信
"""
import multiprocessing

def foo(aa):
    ss=aa.get()#管子的另一端放在子进程这里,子进程接收到了数据
    print("子进程接收到了数据")
    print(ss)#子进程打印接收到的内容


if __name__=="__main__":
    tx=multiprocessing.Queue()#创建进程通信的Queue你可以理解为我拿了个管子来
    jc=multiprocessing.Process(target=foo,args=(tx,))#创建子进程
    jc.start() #启动子进程
    print("主进程准备发送数据...")
    tx.put("有内鬼,终止交易")#管子的一端放在主进程这里,主进程在管子里面发数据
    jc.join()

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值