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中利用Scipy包的SIFT方法进行图片识别的实例教程

    Python中利用Scipy包的SIFT方法进行图片识别是一项比较具有参考意义的技术。下面,我将会详细介绍如何进行这项操作,包括步骤、代码示例以及注意事项等。 步骤 Python中利用Scipy包的SIFT方法进行图片识别的主要步骤如下: 导入必要的包和模块,包括cv2、scipy等; 读取原始图像; 对图像进行预处理,包括去噪、灰度化、裁剪等操作; 使用S…

    python 2023年5月18日
    00
  • 详解Anaconda安装tensorflow报错问题解决方法

    以下是关于“详解Anaconda安装TensorFlow报错问题解决方法”的完整攻略: 问题描述 在使用Anaconda安装TensorFlow的过程中,可能会遇到各种报错,如“ImportError: No module named ‘_pywrap_tensorflow_internal’” “Failed building wheel for gast…

    python 2023年5月13日
    00
  • 解决pyshp UnicodeDecodeError的问题

    以下是关于解决pyshp UnicodeDecodeError 的问题的完整攻略: 问题描述 在使用pyshp库读取Shapefile文件时,可能会遇到UnicodeDecodeError错误。这个错误通是由于文件中包含非ASCII字符而引起的。解决这个问题可以帮助我们正确地读取Shapefile文件。 解决方法 使用以下步骤解决pyshp UnicodeD…

    python 2023年5月13日
    00
  • 一文搞懂关于 sys.argv 的详解

    一文搞懂关于 sys.argv 的详解 在Python中,我们可以使用命令行参数来实现一些特殊的操作。常见的处理命令行参数的方法是使用sys.argv。 sys.argv简介 sys.argv是Python系统模块sys中的一个系统参数列表,它是一个列表,其中第一个元素为程序名称,其余元素为传递给程序的命令行参数。如果没有传递任何参数,那么sys.argv默…

    python 2023年6月2日
    00
  • python如何爬取网页中的文字

    如何使用Python爬取网页中的文字 使用Python爬取网页中的文字需要以下步骤: 导入相关的模块 确定需要爬取的url,并通过requests模块获取相应的网页内容 使用BeautifulSoup模块处理网页内容 将网页内容中的文字提取出来 以下是更详细的解释: 导入相关的模块 在Python中,需要使用到以下三个模块: import requests …

    python 2023年5月14日
    00
  • python内置函数sorted()用法深入分析

    Python内置函数sorted()用法深入分析 Python内置函数sorted()用于对可迭代对象进行排序,返回一个新的已排序的列表。在本篇攻略中,我们将深入分析sorted()函数的用法,并提供两个示例说明。 基本用法 sorted()函数的基本用法如下: sorted(iterable, key=None, reverse=False) 其中,ite…

    python 2023年5月13日
    00
  • jsonpath做接口封装使用技巧

    下面是关于“jsonpath做接口封装使用技巧”的详细攻略: 什么是JsonPath JsonPath是一种轻量级的、语言无关的解析JSON数据的语法。类似于XPath,使用JsonPath可以通过简短的表达式来找到JSON文档中的某个元素,支持复杂的嵌套场景,非常适合做接口测试用例的编写。 JsonPath的语法 JsonPath的语法比较简单,以下是一些…

    python 2023年6月2日
    00
  • python使用in操作符时元组和数组的区别分析

    对于”Python使用in操作符时元组和数组的区别分析”我可以给出以下攻略: 1. 元组和数组的定义及区别 元组(Tuple)和数组(List)都是Python中常见的数据类型,它们的定义和区别如下: 元组(Tuple) 元组是Python中的一种不可变序列,使用括号()括起来,元素之间使用逗号,隔开,具有以下特点: 不可变,元组中的元素不能被修改、添加或删…

    python 2023年5月14日
    00
合作推广
合作推广
分享本页
返回顶部