python3多进程执行循环,Python3多进程 multiprocessing 模块实例详解

本文实例讲述了Python3多进程 multiprocessing 模块。分享给大家供大家参考,具体如下:

多进程 Multiprocessing 模块

Process 类

Process 类用来描述一个进程对象。创建子进程的时候,只需要传入一个执行函数和函数的参数即可完成 Process 示例的创建。

star()方法启动进程,

join()方法实现进程间的同步,等待所有进程退出。

close() 用来阻止多余的进程涌入进程池 Pool 造成进程阻塞。

multiprocessing.Process(group=None, target=None, name=None, args=(), kwargs={}, *, daemon=None)

target是函数名字,需要调用的函数

args函数需要的参数,以 tuple 的形式传入

示例:

结果:

Parent process 809 is Running

process start

process start

process start

process start

process start

Child process 0 810 Running

Child process 1 811 Running

Child process 2 812 Running

Child process 3 813 Running

Child process 4 814 Running

Process close

Pool

Pool 可以提供指定数量的进程供用户使用,默认是 CPU 核数。当有新的请求提交到 Poll 的时候,如果池子没有满,会创建一个进程来执行,否则就会让该请求等待。

- Pool 对象调用 join 方法会等待所有的子进程执行完毕

- 调用 join 方法之前,必须调用 close

- 调用 close 之后就不能继续添加新的 Process 了

pool.apply_async

apply_async方法用来同步执行进程,允许多个进程同时进入池子。

结果:

current process 921

Waiting for all subprocesses done...

Task 0 pid 922 is running, parent id is 921

Task 1 pid 923 is running, parent id is 921

Task 2 pid 924 is running, parent id is 921

Task 0 end.

Task 3 pid 922 is running, parent id is 921

Task 1 end.

Task 4 pid 923 is running, parent id is 921

Task 2 end.

Task 5 pid 924 is running, parent id is 921

Task 3 end.

Task 4 end.

Task 5 end.

All processes done!

pool.apply

apply(func[, args[, kwds]])

该方法只能允许一个进程进入池子,在一个进程结束之后,另外一个进程才可以进入池子。

结果:

Task 0 pid 928 is running, parent id is 927

Task 0 end.

Task 1 pid 929 is running, parent id is 927

Task 1 end.

Task 2 pid 930 is running, parent id is 927

Task 2 end.

Task 3 pid 928 is running, parent id is 927

Task 3 end.

Task 4 pid 929 is running, parent id is 927

Task 4 end.

Task 5 pid 930 is running, parent id is 927

Task 5 end.

Waiting for all subprocesses done...

All processes done!

Queue 进程间通信

Queue 用来在多个进程间通信。Queue 有两个方法,get 和 put。

put 方法

Put 方法用来插入数据到队列中,有两个可选参数,blocked 和 timeout。

- blocked = True(默认值),timeout 为正

该方法会阻塞 timeout 指定的时间,直到该队列有剩余空间。如果超时,抛出 Queue.Full 异常。

blocked = False

如果 Queue 已满,立刻抛出 Queue.Full 异常

get 方法

get 方法用来从队列中读取并删除一个元素。有两个参数可选,blocked 和 timeout

- blocked = False (默认),timeout 正值

等待时间内,没有取到任何元素,会抛出 Queue.Empty 异常。

blocked = True

Queue 有一个值可用,立刻返回改值;Queue 没有任何元素,

结果:

Process(1083) is writing...

Put url_1 to queue...

Process(1084) is writing...

Put url_4 to queue...

Process(1085) is reading...

Get url_1 from queue.

Get url_4 from queue.

Put url_5 to queue...

Get url_5 from queue.

Put url_2 to queue...

Get url_2 from queue.

Put url_6 to queue...

Get url_6 from queue.

Put url_3 to queue...

Get url_3 from queue.

Pipe 进程间通信

常用来在两个进程间通信,两个进程分别位于管道的两端。

multiprocessing.Pipe([duplex])

示例一和示例二,也是网上找的别人的例子,尝试理解并增加了注释而已。网上的例子,大多是例子一和例子二在一起的,这里分开来看,比较容易理解。

示例一:

结果:

con2 got: ['spam', 42, 'egg']

示例二:

结果:

parent got: {'name': 'Bob', 'spam': 42}

talker got: {'ss', 'aa', 'pp', 'mm'}

parent exit

希望本文所述对大家Python程序设计有所帮助。

原文链接:https://blog.csdn.net/cityzenoldwang/article/details/78584175

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值