Python多进程Process和管道Pipe的使用方式

 更新时间:2024年02月10日 09:35:35   作者:AllardZhao  
这篇文章主要介绍了Python多进程Process和管道Pipe的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

如何使用多线程?

实际案例

由于python中全局解释器锁(GIL)的存在,在任意时刻只允许一个线程在解释器中运行。

因此python的多线程不适合处理cpu密集型的任务。

想要处理cpu密集型的任务,可以使用多进程模型。

解决方案

使用标准库中multiprocessing.Process,它可以启动子进程执行任务,操作接口,进程间通信,进程间同步等,都与Threading.Thread类似。

代码演示

(1)进程简单使用

# _*_ encoding:utf-8 _*_
from multiprocessing import Process
 
 
# 定义需要子进程执行函数
def f(s):
    print(s)
 
 
# 创建一个全局变量
x = 1
 
 
# 在f2函数内部修改全局变量的值
def f2():
    # 使用global声明x,然后再修改成5
    global x
    x = 5
 
 
if __name__ == '__main__':
    # 创建子进程执行函数
    p = Process(target=f, args=('hello',))
    # 启动子进程
    p.start()
    # 等待一个进程结束
    p.join()
    '''
    和多线程不一样的是多个进程之间他们使用的虚拟地址空间是独立的。
    '''
    # 在本进程中调用f2,然后查看x发现变成了5
    f2()
    print(x)
    # 将x再修改回去,启动子进程修改
    x = 1
    p1 = Process(target=f2)
    p1.start()
    # 在主进程当中查看x是1还是5
    print(x)
    # 发现x=1,说明子进程和主进程他们看到的,x不是同一个x他们分别是独立的
    # 既然进程之间无法访问彼此的地址空间,进程之间如何通信

(2)Queue队列和Pipe管道的简单使用

# _*_ encoding:utf-8 _*_
from multiprocessing import set_start_method
# 导入进程、队列和管道
from multiprocessing import Process, Queue, Pipe
 
# 注意Queue和queue.Queue并不是同一个对象
q = Queue()
q.put(1)
print(q.get())
 
 
def f(q1):
    print('start')
    # 等待主进程传入一个值
    print(q1.get())
    print('end')
 
 
# Pipe会创建双向的管道
c1, c2 = Pipe()
# 向管道的c1端传入数据,在c2端读取出来
c1.send('abc')
print(c2.recv())
# c2端写入的,从c1端读取出来
c2.send('xyz')
print(c1.recv())
 
 
def f2(c):
    # 从连接中读取数据,然后乘2再写回去
    c.send(c.recv() * 2)
 
 
if __name__ == '__main__':
    '''
    set_start_method为创建进程的方式:
        fork为分支创建,spawn为分产创建。
    '''
    set_start_method('fork', True)
    # ------------------------------
    q2 = Queue()
    # 启动一个子进程直接运行
    Process(target=f, args=(q2,)).start()
    # 子进程阻塞到get,等待传入一个值
    q2.put(100)
    # ------------------------------
    c3, c4 = Pipe()
    # 子进程会等待向管道写
    Process(target=f2, args=(c4,)).start()
    # 从c3端写入数据,然后函数回返回回来,再在c3端读取
    c3.send(55)
    print(c3.recv())

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • python输入多行字符串的方法总结

    python输入多行字符串的方法总结

    在本篇文章里小编给大家分享的是关于python输入多行字符串的方法以及实例代码,需要的朋友们可以学习下。
    2019-07-07
  • python全局解释器GIL锁机制详解

    python全局解释器GIL锁机制详解

    我们要知道一点GIL并不是Python的特性,它是Python解释器Cpython引入的一个概念,下面这篇文章主要给大家介绍了关于python全局解释器GIL锁机制的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2022-12-12
  • Python中截取字符串几种常用的方法

    Python中截取字符串几种常用的方法

    在Python中截取字符串的方法非常简单易懂,你只需要使用字符串的索引即可实现,这篇文章主要给大家介绍了关于Python中截取字符串几种常用的方法,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-05-05
  • 关于初始种子自动选取的区域生长实例(python+opencv)

    关于初始种子自动选取的区域生长实例(python+opencv)

    今天小编就为大家分享一篇关于初始种子自动选取的区域生长实例(python+opencv),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-01-01
  • 详解Python常用标准库之时间模块time和datetime

    详解Python常用标准库之时间模块time和datetime

    time和datetime是Python中常用的两个时间模块,本文将通过示例详细为大家讲讲二者的使用方法,感兴趣的小伙伴可以跟随小编一起学习学习
    2022-05-05
  • python实现图书借阅系统

    python实现图书借阅系统

    这篇文章主要为大家详细介绍了python实现图书借阅系统,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-02-02
  • python+splinter实现12306网站刷票并自动购票流程

    python+splinter实现12306网站刷票并自动购票流程

    这篇文章主要为大家详细介绍了python+splinter实现12306网站刷票并自动购票流程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-09-09
  • Python如何使用Scapy实现端口探测

    Python如何使用Scapy实现端口探测

    Scapy 是一款使用纯Python编写的跨平台网络数据包操控工具,它能够处理和嗅探各种网络数据包,本文主要介绍了Python如何使用使用Scapy实现端口探测,有需要的可以参考下
    2023-10-10
  • Python图像处理之图像量化处理详解

    Python图像处理之图像量化处理详解

    这篇文章将介绍图像量化处理,即将图像像素点对应亮度的连续变化区间转换为单个特定值的过程。文中的示例代码讲解详细,需要的可以参考一下
    2022-02-02
  • wxpython 学习笔记 第一天

    wxpython 学习笔记 第一天

    学习wxpython的朋友,可以看下,了解下wxpython
    2009-03-03

最新评论