张芷铭的个人博客

多进程——multiprocessing

相关链接: https://docs.python.org/zh-cn/3/library/multiprocessing.html https://docs.python.org/3/library/multiprocessing.html

multiprocessing库是Python标准库的一部分,用于支持多进程并行执行。它提供了一种创建和管理进程的方式,与threading库类似,但它使用进程而不是线程,从而避免了GIL(全局解释器锁)限制。

基本概念

  1. 进程(Process):独立的运行环境,每个进程都有自己的内存空间。
  2. 全局解释器锁(GIL):Python解释器的一个机制,同一时刻只允许一个线程执行Python字节码。使用multiprocessing可以绕过GIL,从而实现真正的并行计算。

基本用法

  1. 创建进程:使用multiprocessing.Process类来创建一个新进程。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
import multiprocessing
import time

def worker(name):
    print(f"Worker {name} is starting")
    time.sleep(2)
    print(f"Worker {name} is done")

if __name__ == "__main__":
    process1 = multiprocessing.Process(target=worker, args=("A",))
    process2 = multiprocessing.Process(target=worker, args=("B",))

    process1.start()
    process2.start()

    process1.join()
    process2.join()

    print("Both processes are done")
  1. 进程池(Pool):使用multiprocessing.Pool来管理多个进程池,以便轻松管理并行任务。
1
2
3
4
5
6
7
8
9
from multiprocessing import Pool

def square(x):
    return x * x

if __name__ == "__main__":
    with Pool(4) as p:
        results = p.map(square, [1, 2, 3, 4, 5])
    print(results)
  1. 队列(Queue):用于在进程之间传递消息。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
import multiprocessing

def producer(queue):
    for item in range(5):
        queue.put(item)
        print(f"Produced {item}")

def consumer(queue):
    while not queue.empty():
        item = queue.get()
        print(f"Consumed {item}")

if __name__ == "__main__":
    queue = multiprocessing.Queue()
    producer_process = multiprocessing.Process(target=producer, args=(queue,))
    consumer_process = multiprocessing.Process(target=consumer, args=(queue,))

    producer_process.start()
    producer_process.join()

    consumer_process.start()
    consumer_process.join()
  1. 共享内存(Value 和 Array):用于在进程间共享数据。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
import multiprocessing

def increment(counter):
    for _ in range(1000):
        counter.value += 1

if __name__ == "__main__":
    counter = multiprocessing.Value('i', 0)
    processes = [multiprocessing.Process(target=increment, args=(counter,)) for _ in range(4)]

    for process in processes:
        process.start()

    for process in processes:
        process.join()

    print(f"Counter value: {counter.value}")

学习资源

  1. 官方文档:Python的官方multiprocessing文档是最权威的学习资源。 multiprocessing — Process-based parallelism

  2. 书籍:推荐《Python Cookbook》第三版,作者David Beazley和Brian K. Jones,其中有关于multiprocessing的详细章节。

  3. 视频教程

通过这些资源,你可以进一步加深对multiprocessing库的理解,并能在实际项目中应用它。

💬 评论