Python多进程编程常用方法解析

Python多进程编程常用方法解析

Python作为一门高级编程语言,在多进程编程方面表现优异。多进程编程可以有效地利用计算机的多核心CPU资源,加速程序执行速度,提高程序的效率和性能。

本文将介绍Python多进程编程常用的方法并提供示例进行说明。

多进程编程常用方法

1. multiprocessing模块

multiprocessing模块是Python内置的多进程编程库,它可以创建进程池,利用进程池来处理耗时的任务,提高程序执行效率。multiprocessing模块常用的类和函数有:

  • Process类:创建新进程。
  • Pool类:创建进程池。
  • Queue类:实现进程之间的通信。

示例1:创建新进程

import multiprocessing

def child_process():
    print("子进程PID:", multiprocessing.current_process().pid)

if __name__ == '__main__':
    print("主进程PID:", multiprocessing.current_process().pid)
    p = multiprocessing.Process(target=child_process)
    p.start()
    p.join()

输出:

主进程PID: 1000  
子进程PID: 1001

示例2:创建进程池

import multiprocessing
import time

def task(n):
    print("Process %d is running..." % multiprocessing.current_process().pid)
    time.sleep(n)
    print("Process %d is done." % multiprocessing.current_process().pid)

if __name__ == '__main__':
    start_time = time.time()

    pool = multiprocessing.Pool(processes=3)
    for i in range(5):
        pool.apply_async(task, (i+1,))

    pool.close()
    pool.join()

    print("All processes are done.")
    print("Time used: %f" % (time.time() - start_time))

输出:

Process 1001 is running...
Process 1002 is running...
Process 1003 is running...
Process 1002 is done.
Process 1004 is running...
Process 1001 is done.
Process 1003 is done.
Process 1005 is running...
Process 1004 is done.
Process 1005 is done.
All processes are done.
Time used: 5.045492

2. concurrent.futures模块

concurrent.futures模块是Python 3.2开始引入的多进程编程模块,它提供了高层次的、面向对象的接口来管理并发任务。concurrent.futures常用的类和函数有:

  • ThreadPoolExecutor类:创建线程池。
  • ProcessPoolExecutor类:创建进程池。
  • as_completed函数:按照完成顺序返回Future对象。

示例1:创建线程池

import concurrent.futures
import time

def task(n):
    print("Thread %d is running..." % threading.current_thread().ident)
    time.sleep(n)
    print("Thread %d is done." % threading.current_thread().ident)

if __name__ == '__main__':
    start_time = time.time()

    with concurrent.futures.ThreadPoolExecutor(max_workers=3) as executor:
        futures = [executor.submit(task, i+1) for i in range(5)]

    print("All threads are done.")
    print("Time used: %f" % (time.time() - start_time))

输出:

Thread 140076328464192 is running...
Thread 140076327052288 is running...
Thread 140076319659584 is running...
Thread 140076328464192 is done.
Thread 140076327052288 is done.
Thread 140076317266880 is running...
Thread 140076319659584 is done.
Thread 140076317266880 is done.
Thread 140076337891584 is running...
Thread 140076337891584 is done.
All threads are done.
Time used: 5.012223

示例2:创建进程池

import concurrent.futures
import time

def task(n):
    print("Process %d is running..." % multiprocessing.current_process().pid)
    time.sleep(n)
    print("Process %d is done." % multiprocessing.current_process().pid)
    return n**2

if __name__ == '__main__':
    start_time = time.time()

    with concurrent.futures.ProcessPoolExecutor(max_workers=3) as executor:
        futures = [executor.submit(task, i+1) for i in range(5)]

        results = []
        for future in concurrent.futures.as_completed(futures):
            result = future.result()
            results.append(result)
            print("Result: ", result)

    print("All processes are done.")
    print("Results: ", results)
    print("Time used: %f" % (time.time() - start_time))

输出:

Process 1003 is running...
Process 1002 is running...
Process 1001 is running...
Result:  1
Process 1001 is done.
Process 1001 is running...
Result:  4
Process 1001 is done.
Process 1001 is running...
Result:  9
Process 1003 is done.
Process 1003 is running...
Result:  16
Process 1003 is done.
Process 1003 is running...
Result:  25
Process 1003 is done.
All processes are done.
Results:  [1, 4, 9, 16, 25]
Time used: 5.043380

结论

以上是Python多进程编程常用的方法介绍及示例说明,不同的方法适用于不同场景和需求,应根据实际情况进行选择和使用。在实际应用中,还需要注意多进程编程的资源管理和同步问题,以避免出现死锁、资源泄露等问题。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python多进程编程常用方法解析 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • Python 3 判断2个字典相同

    要判断两个字典是否相同,需要考虑两点: 字典中的键值对是否完全相同。 每个键对应的值是否相同。 接下来,我们将讲解Python3判断2个字典相同的完整攻略。 1. 方法一:使用“==”运算符 在Python中,可以使用“==”运算符直接判断两个字典是否相同。代码实现如下所示: dict_1 = {"a": 1, "b"…

    python 2023年5月13日
    00
  • 不被别人察觉 Android手机的图形锁如何破解?

    对于这个问题,我作为网站作者,首先要明确一点:破解他人手机的图形锁是不道德且可能违法的行为,网站不会鼓励或者支持这种行为。在这里,我只能提供相关技术原理和可能的解决方案,而不会直接介绍破解方法。 在实际操作中,破解Android手机图形锁的方法多种多样,包括但不限于以下几种: 通过adb命令直接修改图形锁密码 这种方法需要在系统开启USB调试的情况下进行,具…

    python 2023年6月3日
    00
  • python列表list保留顺序去重的实例

    以下是“Python列表list保留顺序去重的实例”的完整攻略。 1. Python列表list简介 在Python中,list是一种常用的数据结构,可以储任意的数据类型,包括数字、字符串列表等。list是一种可变的序列,可以进行、删除、修改等操作。 2 Python列表list保留顺序去重 在Python中,我们可以使用set()函数将list中的重复元素…

    python 2023年5月13日
    00
  • Python urlopen()和urlretrieve()用法解析

    Python urlopen() 和 urlretrieve() 用法解析 在Python中,我们可以使用urllib库中的urlopen()和urlretrieve()函数来处理URL。这两个函数都可以用于打开URL并读取其内容,但它们的用法略有不同。本文将详细介绍这两个函数的用法,并提供两个示例。 urlopen()函数 urlopen()函数是Pyth…

    python 2023年5月15日
    00
  • 分步骤教你用python一步步提取PPT中的图片

    以下是详细的“分步骤教你用python一步步提取PPT中的图片”的攻略: 一、获取PPT文件并导入必要的库 首先需要用Python获取要提取图片的PPT文件,可以使用Python的os或glob库来读取文件。接下来,我们需要导入pptx和PIL这两个库,pptx库是Python处理PPT文件的重要库,PIL库用来处理图片。 import os from pp…

    python 2023年6月3日
    00
  • Python中的Socket 与 ScoketServer 通信及遇到问题解决方法

    Python中的Socket与SocketServer模块是进行网络通信的重要工具。使用这两个模块,可以轻松地建立、连接、发送和接收数据等一系列操作。本文将详细介绍Python中的Socket与SocketServer模块的使用方法,并提供遇到问题的解决方法。 Socket模块 Socket模块是Python中用于创建套接字对象的模块。套接字是一种网络通信协…

    python 2023年6月6日
    00
  • Python调用系统命令os.system()和os.popen()的实现

    要详细讲解“Python调用系统命令os.system()和os.popen()的实现”,需要先介绍一下Python的os模块,因为这两个函数都是os模块中的函数。 1. os模块简介 os模块是Python中与操作系统交互的一个常用模块。它提供了许多与操作系统相关的函数和变量,比如文件操作、进程管理、环境变量、用户权限等。os模块中的函数使用较广,这里只介…

    python 2023年5月31日
    00
  • python上的简单迭代

    【问题标题】:simple Iteration on pythonpython上的简单迭代 【发布时间】:2023-04-01 20:00:02 【问题描述】: 我的目标是编写一个类并仅使用__iter__ 和next 方法来查找数字的除数。这是我写的: class Divisors(object): def __init__(self, integer):…

    Python开发 2023年4月8日
    00
合作推广
合作推广
分享本页
返回顶部