python 包之 multiprocessing 多进程

目录
  • 一、创建一个进程
  • 二、创建多个进程
  • 三、管道pipe进行进程间通信
  • 四、队列Queue进行进程间通信
  • 五、进程间同步
  • 六、进程间共享数据
  • 七、进程池

一、创建一个进程

  • 实例化 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

到此这篇关于python 包之 multiprocessing 多进程的文章就介绍到这了,更多相关python   multiprocessing 多进程内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • python multiprocessing 多进程并行计算的操作

    python的multiprocessing包是标准库提供的多进程并行计算包,提供了和threading(多线程)相似的API函数,但是相比于threading,将任务分配到不同的CPU,避免了GIL(Global Interpreter Lock)的限制. 下面我们对multiprocessing中的Pool和Process类做介绍. Pool 采用Pool进程池对任务并行处理更加方便,我们可以指定并行的CPU个数,然后 Pool 会自动把任务放到进程池中运行. Pool 包含了多个并行函数.

  • Python Multiprocessing多进程 使用tqdm显示进度条的实现

    1.背景 在python运行一些,计算复杂度比较高的函数时,服务器端单核CPU的情况比较耗时,因此需要多CPU使用多进程加快速度 2.函数要求 笔者使用的是:pathos.multiprocessing 库,进度条显示用tqdm库,安装方法: pip install pathos 安装完成后 from pathos.multiprocessing import ProcessingPool as Pool from tqdm import tqdm 这边使用pathos的原因是因为,multip

  • python multiprocessing多进程变量共享与加锁的实现

    python多进程和多线程是大家会重点了解的部分,因为很多工作如果并没有前后相互依赖关系的话其实顺序并不是非常的重要,采用顺序执行的话就必定会造成无谓的等待,任凭cpu和内存白白浪费,这是我们不想看到的. 为了解决这个问题,我们就可以采用多线程或者多进程的方式,(多线程我们之后再讲),而这两者之间是有本质区别的.就内存而言,已知进程是在执行过程中有独立的内存单元的,而多个线程是共享内存的,这是多进程和多线程的一大区别. 利用Value在不同进程中同步变量 在多进程中,由于进程之间内存相互是隔离的

  • Python多进程multiprocessing.Pool类详解

    multiprocessing模块 multiprocessing包是Python中的多进程管理包.它与 threading.Thread类似,可以利用multiprocessing.Process对象来创建一个进程.该进程可以允许放在Python程序内部编写的函数中.该Process对象与Thread对象的用法相同,拥有is_alive().join([timeout]).run().start().terminate()等方法.属性有:authkey.daemon(要通过start()设置)

  • 总结python多进程multiprocessing的相关知识

    multiprocessing多进程 概念 创建多进程基本流程 创建进程对象 启动进程 回收进程 代码: import multiprocessing as mp from time import sleep # 进程执行函数 def fun(): print("开始一个进程") sleep(3) print("进程结束") # 创建进程对象 p = mp.Process(target = fun) p.start() # 启动进程 p.join() # 回收进程

  • python 包之 multiprocessing 多进程

    目录 一.创建一个进程 二.创建多个进程 三.管道pipe进行进程间通信 四.队列Queue进行进程间通信 五.进程间同步 六.进程间共享数据 七.进程池 一.创建一个进程 实例化 Process 类创建一个进程对象 然后调用它的 start 方法即可生成一个子进程 from multiprocessing import Process def func(s): print(s) if __name__ == '__main__': p = Process(target=func, args=(

  • Python multiprocessing多进程原理与应用示例

    本文实例讲述了Python multiprocessing多进程原理与应用.分享给大家供大家参考,具体如下: multiprocessing包是Python中的多进程管理包,可以利用multiprocessing.Process对象来创建进程,Process对象拥有is_alive().join([timeout]).run().start().terminate()等方法. multprocessing模块的核心就是使管理进程像管理线程一样方便,每个进程有自己独立的GIL,所以不存在进程间争抢

  • python threading和multiprocessing模块基本用法实例分析

    本文实例讲述了python threading和multiprocessing模块基本用法.分享给大家供大家参考,具体如下: 前言 这两天为了做一个小项目,研究了一下python的并发编程,所谓并发无非多线程和多进程,最初找到的是threading模块,因为印象中线程"轻量...","切换快...","可共享进程资源..."等等,但是没想到这里水很深,进而找到了更好的替代品multiprocessing模块.下面会讲一些使用中的经验. 后面出现的

  • 处理python中多线程与多进程中的数据共享问题

    之前在写多线程与多进程的时候,因为一般情况下都是各自完成各自的任务,各个子线程或者各个子进程之前并没有太多的联系,如果需要通信的话我会使用队列或者数据库来完成,但是最近我在写一些多线程与多进程的代码时,发现如果它们需要用到共享变量的话,需要有一些注意的地方 多线程之间的共享数据 标准数据类型在线程间共享 看以下代码 #coding:utf-8 import threading def test(name,data): print("in thread {} name is {}".fo

  • python线程安全及多进程多线程实现方法详解

    进程和线程的区别 进程是对运行时程序的封装,是系统资源调度和分配的基本单位 线程是进程的子任务,cpu调度和分配的基本单位,实现进程内并发. 一个进程可以包含多个线程,线程依赖进程存在,并共享进程内存 什么是线程安全 一个线程的修改被另一个线程的修改覆盖掉. python中哪些操作是线程安全的 一个操作可以在多线程环境中使用,并且获得正确的结果. 线程安全的操作线程是顺序执行的而不是并发执行的. 一般涉及到写操作需要考虑如何让多个线程安全访问数据. 线程同步的方式 互斥量(锁): 通过互斥机制防

  • python学习笔记之多进程

    我们现代的操作系统,都是支持"多任务"的操作系统,对于操作系统来说,一个任务就是一个进程(process).比如打开一个浏览器就是启动一个浏览器进程. 如果我们将计算器的核心CPU比喻为一座工厂,那么进程就像工厂里的车间,它代表CPU所能处理的单个任务.任一时刻,CPU总是运行一个进程,其他进程处于非运行状态. 看到这大家可能会有一些疑问了,其他进程处于非运行状态?可是我用浏览器访问网页的时候,音乐播放器明明也在运行啊. 实际上是操作系统轮流让各个任务交替执行,任务1执行0.01秒,切

  • Python利用socket实现多进程的端口扫描器

    作为开发人员经常需要查看服务的端口开启状态判断服务是否宕机. 特别是部署的服务比较多的情况下,可能存在几个甚至几十个服务端口的占用,于是我利用socket不断向服务发送请求的方式来判断端口服务是否已经完成开启. 其中加入多进程的调用方式来提高端口扫描的效率,供大家参考! 首先,我们将需要的python模块全部导入到我们的代码块中,若是没有安装的模块使用pip的当时安装一下即可. # Importing the socket module. import socket # Importing th

  • 使用setup.py安装python包和卸载python包的方法

    我们使用 python setup.py install 来安装python包,但是如何卸载呢? 只能手动删除安装的文件 可以使用如下命令 复制代码 代码如下: python setup.py install --record files.txt 记录安装后文件的路径 cat files.txt | xargs rm -rf  删除这些文件

  • 用Anaconda安装本地python包的方法及路径问题(图文)

    Anaconda确实带来了很多方便,但是之前也过多的依赖了conda自带的一键下载python包的功能.这不,这几天突然要用FastFM这个包,无奈conda里没有,于是只能从github下载下来,实现本地安装. 以下是手动下载和安装步骤: 一.从GitHub上下载: 选择releases,里面会看到一系列版本的包,选择自己电脑对应的型号,点击下载.我选择的是fastFM-0.2.11-cp36-cp36m-macosx_10_7_x86_64.whl,由于电脑是mac,python版本为3.6

  • Pycharm导入Python包,模块的图文教程

    1.点击File->settings 2.选择Project Interpreter,点击右边绿色的加号添加包 3.输入你想添加的包名,点击Install Package 4.可以在Pycharm保存项目的目录下查看已经安装的包,路径D:\PycharmProjects\untitled\venv\Lib\site-packages 以上这篇Pycharm导入Python包,模块的图文教程就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们.

随机推荐