IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> Python中的多进程编程 -> 正文阅读

[Python知识库]Python中的多进程编程

众所周知,python的多线程提供的只是并发性,不会实际加快运行效率。而多进程则是用资源换取效率,可以实现真正的并行性。对于高阶Pythoner而言,掌握多进程非常有必要。
这篇文章主要想帮助大家理解Python多进程的运行机制基本概念,并且提供一个较为通用的多线程启动模板
先看一段使用多进程的代码:

import time
from multiprocessing import Process

class Runner(Process):
    def __init__(self, name, lat=1):
        super().__init__()
        self.name = name
        self.latency = lat
    def run(self):
        print('%s running' % self.name)
        time.sleep(self.latency)
        print('%s running end' % self.name)
        
p1 = Runner('p1', lat=1)
p2 = Runner('p2', lat=2)
p3 = Runner('p3', lat=1)
p4 = Runner('p4', lat=4)
p1.start()
p2.start()
p3.start()
p4.start()
print('ok')

咱们开了4个进程,假设要处理4个任务,每个任务需要的延迟时间在lat中定义出来了。对于进程p1-p4而言,只要start()就会启动,然后互相几乎不会影响其他进程的延迟时间。运行结果:

p1 running
p2 running
ok
p3 running
p4 running
p1 running end
p3 running end
p2 running end
p4 running end

这个结果咱们要结合时间戳来看,‘p1 running’、‘p2 running’、‘ok’、‘p3 running’、'p4 running’这4行几乎是同一时间打印出来的。而后面的4个end则都经过了相应的延迟时间之后才打印出来。
我这里想到一个形象化的比喻:4个进程就像4支蜡烛,咱们依次点亮它们,每根蜡烛可以烧[1, 2, 1, 4]个小时,相对于hour级别的燃烧时间,咱们点亮它们所花费的几秒中的时间差可以忽略,我们可以认为它们是同一时间起燃的。于是,前5行几乎是同一时间打印出来。这里需要注意的是,主程序中的"ok"也跟几个进程同时打印出来。所以,这里可以掌握一种sense:对于主程序来讲,进程只管触发一下(如p1.start()),程序会继续往下走,不会等待进程运行结束。

如果我想让主程序等待一下进程结束再运行呢:那就用join()
上面代码稍微改动:

import time
from multiprocessing import Process

class Runner(Process):
    def __init__(self, name, lat=1):
        super().__init__()
        self.name = name
        self.latency = lat
    def run(self):
        print('%s running' % self.name)
        time.sleep(self.latency)
        print('%s running end' % self.name)
        
p1 = Runner('p1', lat=1)
p2 = Runner('p2', lat=2)
p3 = Runner('p3', lat=1)
p4 = Runner('p4', lat=4)
p1.start()
p1.join()
p2.start()
p3.start()
p4.start()
p4.join()
print('ok')

只加了2个join(),那么打印顺序会出现怎么样的改变呢?先别急着看输出结果,咱分析一波:p1先start(),但是立马就join()了,阻塞了主程序,那么p2.start()这一行要等p1结束才会运行。等p1运行结束,p2,p3,p4同一时间start,然后p4后面接了一个join(),又会最主程序,那么print(‘ok’)会等待p4结束才会运行。p4需要运行4s,在主程序等待这4秒的过程中,运行时间2秒的p2和运行时间1秒的p3也已经运行完毕,所以p3先结束,其次是p2然后是p4,p4结束才会又进入主程序。听没听懂都点个赞呗~
所以运行结果如下:

p1 running
p1 running end
p2 running
p3 running
p4 running
p3 running end
p2 running end
p4 running end
ok

到这里还有问题,请留言交流~

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2022-03-24 00:30:34  更:2022-03-24 00:32:02 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 20:40:39-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码