python 包之 multiprocessing 多进程
作者:autofelix 发布时间:2021-02-25 12:13:15
标签:python,multiprocessing,多进程
一、创建一个进程
实例化 Process 类创建一个进程对象
然后调用它的 start 方法即可生成一个子进程
from multiprocessing import Process
def func(s):
print(s)
if __name__ == '__main__':
p = Process(target=func, args=('autofelix', ))
p.start()
p.join()
二、创建多个进程
from multiprocessing import Process
def func(s):
print(s)
if __name__ == '__main__':
process = [
Process(target=func, args=('1', ))
Process(target=func, args=('2', ))
]
[p.start() for p in process]
[p.join() for p in process]
三、管道pipe进行进程间通信
Pipe(duplex=True):表示双工通信,也就是双向的,既可以接受也可以发送数据,默认为True
Pipe(duplex=False):表示单工通信,也就是单向的,只能进行接受或者发送数据
from multiprocessing import Process, Pipe
def func(conn):
print('send a list object ot other side...')
# 从管道对象的一端发送数据对象
conn.send(['33', 44, None])
conn.close()
if __name__ == '__main__':
# 默认创建一个双工管道对象,返回的两个对象代表管道的两端,
# 双工表示两端的对象都可以发送和接收数据,但是需要注意,
# 需要避免多个进程或线程从一端同时读或写数据
parent_conn, child_conn = Pipe()
p = Process(target=func, args=(child_conn, ))
p.start()
# 从管道的另一端接收数据对象
print(parent_conn.recv())
p.join()
四、队列Queue进行进程间通信
当向队列中放入的数据较大时,就会在
join()
处卡死为了避免这种情况,常的做法是先使用get()将数据取出来,再使用join()方法
如果不这样处理,队列进程将不能正常终止,造成死锁情况
from multiprocessing import Process, Queue
def func(q):
print('put a list object to queue...')
# 向Queue对象中添加一个对象
q.put(['33', 44, None])
if __name__ == '__main__':
# 创建一个队列
q = Queue()
p = Process(target=func, args=(q, ))
p.start()
# 从Queue对象中获取一个对象
print(q.get())
p.join()
-----------------------------------
©著作权归作者所有:来自51CTO博客作者autofelix的原创作品,谢绝转载,否则将追究法律责任
python 包之 multiprocessing 多进程教程
https://blog.51cto.com/autofelix/5166197
五、进程间同步
使用锁保证进程间的同步操作
from multiprocessing import Process, Lock
def func(lc, num):
# 使用锁保证以下代码同一时间只有一个进程在执行
lc.acquire()
print('process num: ', num)
lc.release()
if __name__ == '__main__':
lock = Lock()
for i in range(5):
Process(target=func, args=(lock, i)).start()
六、进程间共享数据
使用共享内存的方式,共享值Value对象和数据Array对象
from multiprocessing import Process, Value, Array
def func(n, a):
n.value = 3.333
for i in range(len(a)):
a[i] = -a[i]
if __name__ == '__main__':
# 第一个参数d表示数据类型'double'双精度浮点类型
num = Value('d', 0.0)
# 第一个参数i表示数据类型'integer'整型
arr = Array('i', range(6))
p = Process(target=func, args=(num, arr))
p.start()
p.join()
print(num.value)
print(arr[:])
七、进程池
创建一个
Pool
进程池对象,并执行提交给它的任务进程池对象允许其中的进程以不同的方式运行
但是需要注意,Pool 对象的方法只能是创建它的进程才能调用
from multiprocessing import Pool
import time
def f(x):
return x * x
if __name__ == '__main__':
with Pool(processes=4) as pool: # start 4 worker processes
# 在进程池中开启一个新的进程并执行 f 函数
result = pool.apply_async(f, (10,)) # evaluate "f(10)" asynchronously in a single process
print(result.get(timeout=1)) # prints "100" unless your computer is *very* slow
# map会一直阻塞当前进程直到运行完可迭代对象中的所有元素,并返回结果。
print(pool.map(f, range(10))) # prints "[0, 1, 4,..., 81]"
# imap是map方法的延迟执行版本,对于比较消耗内存的迭代,建议使用这个方法,
it = pool.imap(f, range(10))
print(next(it)) # prints "0"
print(next(it)) # prints "1"
print(it.next(timeout=1)) # prints "4" unless your computer is *very* slow
result = pool.apply_async(time.sleep, (10,))
print(result.get(timeout=1)) # raises multiprocessing.TimeoutError
来源:https://blog.51cto.com/autofelix/5166197
0
投稿
猜你喜欢
- UTC与DSTUTC可以视为一个世界统一的时间,以原子时为基础,其他时区的时间都是在这个基础上增加或减少的,比如中国的时区就为UTC+8。D
- 本文实例讲述了python实现根据图标提取分类应用程序,分享给大家供大家参考。具体方法如下:#!/usr/bin/python # -*-
- 如下所示:区别ArrayTensor类型uint8,float32系列{}各类型相互转换uint8转float64:image = imag
- 目录先看演示像类一样的访问属性类似字典的访问为什么可以这样?源码解析为什么有类的影子?为什么有字典的影子?先看演示像类一样的访问属性from
- 本文实例介绍了如何使用ASP代码来读写注册表,呵呵厉害吧! 一个例子: <%Dim ReadComputerNam
- 最近学了一点点python爬虫的知识,面向百度编程爬了一本小说之后感觉有点不满足,于是突发奇想尝试爬一本漫画下来看看。一、效果展示首先是我们
- PHP 5.0.0 和PHP 4.0.38 于2004年7月13日同时发布,这是一个值得我们PHP爱好者的一大喜讯。期盼已久的PHP5终于出
- function f(x){ alert(x); return
- python版本: Python 2.7.61: sys是python自带模块. 利用 import 语句输入sys 模块。当执行impor
- Google Chrome 的发布,使我们更加的注重基于 WebKit 核心的浏览器的表现情况,但我们很多时候“不小心”就会出现问题。考虑下
- (一)什么是json:JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。易于人阅读和编写。同时也
- 前言对程序员来说,‘python’ 和’python ’看起
- 在python中我们可以使用requests模块来实现调用远程接口一:安装requests模块pip install requests二:使
- 矛盾出来了,像我们这些小作坊,基本都是设计布局一人搞定。甚至还有加后台程序的。假设设计的时候考虑布局了,我们都有这个能力进行调整。但像大公司
- 一、Tensorlow结构import tensorflow as tfimport numpy as np#创建数据x_data = np
- 我一直使用Microsoft的FrontPage 98来开发ASP/ADO之类的Internet数据库应用程序。现在我听说许多人都非常信奉采
- 本文实例讲述了Python tkinter模块弹出窗口及传值回到主窗口操作。分享给大家供大家参考,具体如下:有些时候,我们需要使用弹出窗口,
- 在进行增强现实的时候我们需要用到两个工具包:PyGame 和 PyOpenGL,本章在python环境下对这两个工具包的安装进行说明。一、安
- 上文:栅格:从混乱到秩序Jacci Howard Bear 的英文原文:http://desktoppub.about.com/od/gri
- sql server 全文检索有两种搜索方式,一种是contains,另一种是freetext。前者是包含,类似于 like '%关