乔克视界 乔克视界
首页
  • 运维
  • 开发
  • 监控
  • 安全
  • 随笔
  • Docker
  • Golang
  • Python
  • AIOps
  • DevOps
  • 心情杂货
  • 读书笔记
  • 面试
  • 实用技巧
  • 博客搭建
友链
关于
收藏
  • 分类
  • 标签
  • 归档

乔克

云原生爱好者
首页
  • 运维
  • 开发
  • 监控
  • 安全
  • 随笔
  • Docker
  • Golang
  • Python
  • AIOps
  • DevOps
  • 心情杂货
  • 读书笔记
  • 面试
  • 实用技巧
  • 博客搭建
友链
关于
收藏
  • 分类
  • 标签
  • 归档
  • Docker

  • Golang

  • AIOps

  • Python

    • 基础知识

      • Python之链表
      • Python 之类的初识
      • Python之函数式编程
      • Python之匿名函数
      • Python之自定义函数
      • Python之异常处理
      • Python之条件与循环
      • Python之列表生成式
      • Python之生成器
      • Python之装饰器
      • Python之迭代器
      • Python之进程、线程、协程
        • 一、进程
          • 1、进程间共享数据
          • 1.1 Queue
          • 1.2 Pipes
          • 1.3 Manger
        • 二、线程
        • 三、协程
      • Python之深浅拷贝
      • Python之反射
      • Python之并发编程
      • Python之垃圾回收机制
      • Python之断言assert
      • Python之上下文管理器和with语句
      • Python中JSON的对应关系
      • Python之单例模式
    • Django框架

    • 其他

  • DevOps

  • 专栏
  • Python
  • 基础知识
乔克
2025-07-19
目录

Python之进程、线程、协程

# 一、进程

进程就是一个程序在数据集上动态的一次动态执行过程。

进程一般由程序、数据集、进程控制块三部分组成。我们编写的程序用来描述进程要完成哪些功能以及如何完成;数据集则是程序在执行过程中所需要使用的资源;进程控制块用来记录进程的外部特征,描述进程的执行变化过程,系统可以利用它来控制和管理进程,它是系统感知进程存在的唯一标志。

multiprocessing 模块是 python 的多进程管理包,它和 threading 很大部分使用同一套 API。

使用共享 API 的注意事项:

(1)、在 UNIX 平台,当某个进程结束后,该进程需要被父进程调用 wait,否则会称为僵尸进程,所以有必要对每个 process 调用 join()方法;

(2)、multiprocessing 提供 threading 没有的 IPC,效率更高,应该优选 Pipe,Queue;

(3)、多进程应该避免共享资源;

例子:

from multiprocessing import Process
import time

def f(name):
    time.sleep(1)
    print('hello {} {}'.format(name, time.time()))

if __name__ == "__main__":
    p_list = []
    for i in range(3):
        p = Process(target=f, args=('joker',))
        p_list.append(p)
        p.start()

    for i in p_list:
        i.join()

    print('end')
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

例子:用类创建进程

from multiprocessing import Process
import time

class MyProcess(Process):
    def __init__(self, name):
        self.name = name
        super(MyProcess, self).__init__()

    def run(self):
        print("hello {} {}".format(self.name, time.time()))

if __name__ == "__main__":
    p_list = []
    for i in range(3):
        p = MyProcess('joker')
        p_list.append(p)
        p.start()

    for i in p_list:
        i.join()

    print('end')
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

# 1、进程间共享数据

# 1.1 Queue

进程之间的 Queue 是 copy 的,是通过 pickle 做序列化存起来,取的时候反 pickle 取出来。

from multiprocessing import Process, Queue
import time

def func(q, n):
    q.put([42, n, 'hello'])

if __name__ == "__main__":
    q = Queue()
    p_list = []
    for i in range(3):
        p = Process(target=func, args=(q, 2,))
        p_list.append(p)
        p.start()

    print(q.get())
    print(q.get())
    print(q.get())

    for i in p_list:
        i.join()

    print('end')
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 1.2 Pipes
from multiprocessing import Process, Pipe
def f(conn):
    conn.send([42, None, 'hello'])
    conn.close()

if __name__ == '__main__':
    parent_conn, child_conn = Pipe()
    p = Process(target=f, args=(child_conn,))
    p.start()
    print(parent_conn.recv())
    p.join()
1
2
3
4
5
6
7
8
9
10
11
# 1.3 Manger
from multiprocessing import Process
def f(d,l,n):
    d[n] = '1'
    d['2'] = 2
    d[0.25] = None
    l.append(n)
    print(l)
if __name__ == '__main__':
    with Manager() as manager:
        d = manager.dict()
        l = manager.list(range(5))
        p_list = []
        for i in range(10):
            p = Process(target=f, args=(d,l,i))
            p.start()
            p_list.append(p)

        for i in p_list:
            i.join()

    print(d)
    print(l)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

# 二、线程

线程也叫轻量级进程,它是一个基本的 CPU 执行单元,也是程序执行过程中的最小单元,由线程 ID、程序计数器、寄存器集合 和堆栈共同组成。线程的引入减小了程序并发执行时的开销,提高了操作系统的并发性能。 线程没有自己的系统资源,只拥有在运行时必不可少的资源。但线程可以与同属与同一进程的其他线程共享进程所拥有的其他资源。

线程是属于进程的,线程运行在进程空间内,同一进程所产生的线程共享同一内存空间,当进程退出时该进程所产生的线程都会被强制退出并清除。线程可与属于同一进程的其它线程共享进程所拥有的全部资源,但是其本身基本上不拥有系统资源,只拥有一点在运行中必不可少的信息(如程序计数器、一组寄存器和栈)。

# 三、协程

作者:乔克

本文链接:https://jokerbai.com

版权声明:本博客所有文章除特别声明外,均采用 署名-非商业性-相同方式共享 4.0 国际 (CC-BY-NC-SA-4.0) 许可协议。转载请注明出处!

上次更新: 2025/07/19, 11:33:23
Python之迭代器
Python之深浅拷贝

← Python之迭代器 Python之深浅拷贝→

最近更新
01
使用 Generic Webhook Trigger 触发 Jenkins 多分支流水线自动化构建
07-19
02
使用Zadig从0到1实现持续交付平台
07-19
03
基于Jira的运维发布平台
07-19
更多文章>
Theme by Vdoing | Copyright © 2019-2025 乔克 | MIT License | 渝ICP备20002153号 |
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式