python 包之 multiprocessing 多进程

 更新时间:2022年04月02日 11:05:07   作者:autofelix  
这篇文章主要介绍了python 包之 multiprocessing 多进程,首先创建一个进程。实例化 Process 类创建一个进程对象、然后调用它的 start 方法即可生成一个子进程,下文更多相关资料,需要的朋友可以参考一下

一、创建一个进程

  • 实例化 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 多进程内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 解决Python 函数声明先后顺序出现的问题

    解决Python 函数声明先后顺序出现的问题

    这篇文章主要介绍了如何解决Python 函数声明先后顺序的问题,帮助大家更好的理解和学习python,感兴趣的朋友可以了解下
    2020-09-09
  • 用python写的一个wordpress的采集程序

    用python写的一个wordpress的采集程序

    在学习python的过程中,经过不断的尝试及努力,终于完成了第一个像样的python程序,虽然还有很多需要优化的地方,但是目前基本上实现了我所要求的功能,需要的朋友可以参考下
    2016-02-02
  • Python常用内置模块之xml模块(详解)

    Python常用内置模块之xml模块(详解)

    下面小编就为大家带来一篇Python常用内置模块之xml模块(详解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05
  • Python字典和集合讲解

    Python字典和集合讲解

    这篇文章主要给大家假关节的是Python字典和集合,字典是Python内置的数据结构之一,是一个无序的序列;而集合是python语言提供的内置数据结构,没有value的字典,集合类型与其他类型最大的区别在于,它不包含重复元素。想具体了解有关python字典与集合,请看下面文章内容
    2021-10-10
  • 利用Python Matlab绘制曲线图的简单实例

    利用Python Matlab绘制曲线图的简单实例

    们经常会遇到这种情况,有一个数学函数,我们希望了解他的图像,这个时候使用python 的matplotlib就可以帮助我们,下面这篇文章主要介绍了利用Python Matlab绘制曲线图的相关资料,需要的朋友可以参考下
    2021-12-12
  • Python写安全小工具之TCP全连接端口扫描器

    Python写安全小工具之TCP全连接端口扫描器

    这篇文章主要介绍了Python写安全小工具之TCP全连接端口扫描器,文章通过TCP connect来实现一个TCP全连接端口扫描器。具有一定的参考价值,需要的小伙伴可以参考一下
    2022-05-05
  • Python 创建子进程模块subprocess详解

    Python 创建子进程模块subprocess详解

    这篇文章主要介绍了Python 创建子进程模块subprocess详解,本文详细讲解了subprocess模块的方法、参数、使用实例等,需要的朋友可以参考下
    2015-04-04
  • Python的None和C++的NULL用法解读

    Python的None和C++的NULL用法解读

    这篇文章主要介绍了Python的None和C++的NULL用法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-05-05
  • Jupyter安装nbextensions,启动提示没有nbextensions库

    Jupyter安装nbextensions,启动提示没有nbextensions库

    这篇文章主要介绍了Jupyter安装nbextensions,启动提示没有nbextensions库,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-03-03
  • Python开发之利用re模块去除代码块注释

    Python开发之利用re模块去除代码块注释

    Python的re模块主要是正则表达式的操作函数,下面这篇文章主要给大家介绍了关于Python开发之利用re模块去除代码块注释的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-11-11

最新评论