python多进程操作实例

Python 多进程操作实例攻略

Python 多进程是一种常用的处理大量数据和计算密集型任务的方式,它可以充分利用 CPU 的多核心特性,提高程序的执行效率。本文将介绍如何使用 Python 实现多进程操作,并提供两个简单的示例说明。

使用 multiprocessing 模块

Python 提供了一个名为 multiprocessing 的内置模块,它可以帮助你快速实现多进程操作。使用 multiprocessing 可以创建新进程、管理进程、共享数据等等。

创建新进程

在 Python 中,可以使用 Process 类来创建新的进程。以下是一个简单的示例:

from multiprocessing import Process

def worker():
    """子进程要执行的任务"""
    print("This is a new process.")

if __name__ == '__main__':
    p = Process(target=worker)
    p.start()

上述代码中,我们首先导入了 Process 类,创建了一个函数 worker 作为子进程要执行的任务。然后在主进程中,我们创建了一个 Process 实例 p,指定了要执行的任务为 worker。最后,我们通过调用 p.start() 来启动新的进程。

管理进程

在使用 multiprocessing 时,可以使用 Pool 类来管理进程池。一个进程池中通常包含多个进程,可以在该进程池中同时运行多个子进程。

以下是一个示例,其中我们使用 Pool 类来处理并行任务:

from multiprocessing import Pool

def worker(num):
    """子进程要执行的任务"""
    return num**2

if __name__ == '__main__':
    # 创建进程池,拥有 4 个进程
    pool = Pool(processes=4)

    # 带入多个参数并行执行任务
    results = pool.map(worker, [1, 2, 3, 4, 5])
    print(results)

上述代码中,我们创建了一个 Pool 实例 pool,指定了该进程池中要运行 4 个进程。接着,我们使用 map 函数将任务分配给多个进程,其中 [1, 2, 3, 4, 5] 是带入函数 worker 的参数,它们会被依次传入子进程执行,最终返回的结果被保存在 results 中,打印输出即可看到结果。

共享数据

在使用多进程时,往往需要利用共享内存来保存数据。Python 提供了 ValueArray 两个类实现不同的数据类型的共享数据。

以下是一个使用 Value 类来共享数据的示例:

from multiprocessing import Process, Value

def worker(myvalue):
    """子进程要执行的任务"""
    myvalue.value += 1
    print(f"Process {myvalue.value}")

if __name__ == '__main__':
    myvalue = Value('i', 0) # 创建共享数值对象,初始值为 0
    processes = [Process(target=worker, args=(myvalue,)) for i in range(10)] # 创建多个进程
    for p in processes:
        p.start()
    for p in processes:
        p.join()

上述代码中,我们首先创建了一个 Value 类对象 myvalue,它的数据类型为整数,初始化为 0。然后我们创建了 10 个进程,每个进程都会对 myvalue 的值进行加 1 操作,并输出当前的数值。

示例1:计算质数

以下代码是一个简单的示例,使用多进程计算从 1 到 100 之间所有的质数。

import math
from multiprocessing import Process, Queue

def is_prime(num):
    """判断一个数是否为质数"""
    if num <= 1:
        return False
    for i in range(2, int(math.sqrt(num))+1):
        if num % i == 0:
            return False
    return True

def worker(start, end, queue):
    """子进程要执行的任务"""
    primes = [num for num in range(start, end+1) if is_prime(num)]
    queue.put(primes)

if __name__ == '__main__':
    queue = Queue() # 创建队列,用于存放结果
    processes = [Process(target=worker, args=(i*10+1, i*10+10, queue)) for i in range(10)] # 创建多个进程
    for p in processes:
        p.start()
    for p in processes:
        p.join()
    results = []
    while not queue.empty():
        results.extend(queue.get())
    results.sort()
    print(results)

在此示例中,我们首先定义了一个函数 is_prime,用于判断一个数是否为质数。然后我们创建了多个子进程,每个子进程会计算一段范围内的质数,将结果存入一个队列中。最后我们使用主进程读取队列中的结果,并排序输出。

示例2:爬取多条路线公交车站信息

以下代码是一个简单的示例,使用多进程爬取北京多条路线公交车站信息,并将结果保存至本地文件。

import requests
from multiprocessing import Process, Pool

def get_data(url, filename):
    """获取网页数据"""
    response = requests.get(url)
    with open(filename, 'w') as outfile:
        outfile.write(response.text)
    print(f"{url} saved to file {filename}.")

def worker(line):
    """子进程要执行的任务"""
    url = f"http://www.bjbus.com/home/ajax_rtbus_data.php?act=busTime&selBLine={line}&selBDir=0&selBStop=0"
    filename = f"{line}.html"
    get_data(url, filename)

if __name__ == '__main__':
    pool = Pool(processes=4) # 创建进程池,拥有 4 个进程
    lines = ['101', '103', '105', '107', '111', '116', '118', '127', '132', '359', '363'] # 待爬行的公交路线
    pool.map(worker, lines) # 使用进程池并行执行多个任务

在此示例中,我们首先定义了一个函数 get_data,用于获取一个网页的数据,并将其保存至本地文件。然后我们创建了一个进程池,指定其拥有 4 个进程。接着我们定义了一个列表 lines,它包含了要爬取的多个公交路线。最后我们使用进程池的 map 方法,将待执行的任务全部提交给多个进程进行并行处理。每个子进程将负责爬取一条公交路线的数据,并将结果保存至本地。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python多进程操作实例 - Python技术站

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

相关文章

  • python3调用百度翻译API实现实时翻译

    下面是详细讲解的攻略: 1. 准备工作 1.1 获取百度翻译API的APP ID和密钥 首先你需要拥有一个百度账号,然后前往百度翻译API官网,登录并创建一个APP,然后获取到APP ID和密钥,这是调用API的必须参数。 1.2 安装Python SDK包 我们可以使用Python SDK包来方便地调用百度翻译API,这里我们使用baidu-transla…

    python 2023年6月3日
    00
  • 书单|人生苦短,你还不用python!

    书单|人生苦短,你还不用python! 为什么学习Python Python 是一种高级编程语言,使用简洁明了的语法和丰富的库,可以轻松完成各种开发任务。Python 具有以下优势: 易于学习: Python 代码简洁易懂,语法简单,拥有大量示例代码和教程方便学习使用。 应用广泛: Python 可以在各种领域应用,如 Web 开发、人工智能、数据分析、爬虫…

    python 2023年5月14日
    00
  • Python语言检测模块langid和langdetect的使用实例

    下面是详细讲解“Python语言检测模块langid和langdetect的使用实例”的完整攻略。 简介 在文本分析领域,语言检测模块是一个重要的工具。Python语言提供了两种流行的语言检测模块:langid和langdetect。这两个模块都可以用来检测文本的语言,可以帮助我们进行自然语言处理、机器翻译、文本分类等任务。 langid langid是一个…

    python 2023年6月3日
    00
  • Python 完美解决 Import “模块“ could not be resolved …的问题

    当在Python中导入模块时,有时会遇到“ImportError: No module named ‘module_name’”或“ImportError: cannot import name ‘function_name’”等错误。这些错误通常是由于模块路径不正确或者模块名称拼写错误引起的。本攻略将提供Python完美解决“ImportError: ca…

    python 2023年5月13日
    00
  • python字符串的多行输出的实例详解

    以”python字符串的多行输出的实例详解”为主题,以下是完整的攻略。 什么是Python字符串的多行输出? 在Python中,字符串通常是单行变量。但是,在某些情况下,我们需要在一个变量中包含多行文本。这可能会涉及到长的描述、注释或多行代码。在这种情况下,使用多行字符串输出就非常方便。 三种方式实现Python字符串的多行输出 在Python中,有几种不同…

    python 2023年6月5日
    00
  • Python调用讯飞语音合成API接口来实现文字转语音

    讯飞语音合成API接口是一种将文字转换为语音的技术,可以帮助我们实现语音合成功能。本文将详细讲解如何使用Python调用讯飞语音合成API接口,包括如何获取API接口密钥、如何发送HTTP请求、如何处理响应等。 获取API接口密钥 在使用讯飞语音合成API接口之前,我们需要先获取API接口密钥。我们可以在讯飞开放平台注册账号,并创建应用程序,获取API接口密…

    python 2023年5月15日
    00
  • 深入理解python中的select模块

    Python中的select模块是一个高效的I/O多路复用模块,可以用于同时监视多个文件描述符的状态。本攻略将介绍select模块的基本用法和示例。 select模块基础 select模块提供了三个函数:select、poll和epoll。这些函数都可以用于监视多个文件描述符的状态,并在文件描述符就绪时通知应用程序。以下是一个示例代码,用于使用select模…

    python 2023年5月15日
    00
  • Python+selenium实现自动循环扔QQ邮箱漂流瓶

    Python+selenium实现自动循环扔QQ邮箱漂流瓶 引言 在教程开始之前,本文假设你已经具备以下的前置知识:1. Python基础知识2. Selenium库的基本使用3. Chrome浏览器基本的操作 如果你还没有相关的经验,建议先学习相关基础知识后再进行本教程的实践。 在本教程中,我们将使用Python语言和Selenium库实现QQ邮箱漂流瓶的…

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