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日

相关文章

  • python 字符串和整数的转换方法

    Python 中字符串与整数的转换方法非常简单,我们可以使用内置的函数实现这一功能。 从字符串转换为整数 将字符串转换为整数的过程叫做“字符串转整数”,在 Python 中有两种方法可以实现。 方法1: 使用 int() 函数 我们可以使用 int() 函数将字符串转换为整数。int() 函数接受一个字符串作为参数,返回一个整数。 num_str = &qu…

    python 2023年6月5日
    00
  • python实现日志按天分割

    下面是“python实现日志按天分割”的完整攻略,包含以下几个步骤: 安装Python日志系统模块logging 在命令行工具输入以下命令进行模块安装 pip install logging 编写Python日志代码块 以下是一个简单的Python日志代码示例。该示例使用logging模块,将日志按天创建,并保存到logs目录下的文件中。 import lo…

    python 2023年6月2日
    00
  • 一文详解Python中生成器的原理与使用

    一文详解Python中生成器的原理与使用 什么是生成器? 生成器是Python中进行迭代操作的一种方式,它可以节省内存空间,提高代码执行效率。生成器使用 yield 语句在函数中实现,每次调用生成器时会返回一个值并暂停执行,等待下一次调用继续执行。 生成器的实现原理 生成器的实现原理是使用了 Python 中的协程(Coroutine)。协程是一种特殊的函数…

    python 2023年6月3日
    00
  • 如何在Python中创建频率表

    在Python中创建频率表可以通过使用字典(dictionary)来实现,以下是具体步骤: 读取数据并将其存储在列表中。假设我们要分析的数据包含在一个名为data的列表中。 创建一个新的字典用于存储频率数据。我们可以使用collections模块中的defaultdict函数来创建一个在访问不存在键时默认返回0的字典。 from collections im…

    python-answer 2023年3月25日
    00
  • python – 有没有办法让不和谐的机器人听另一个不和谐的机器人?

    【问题标题】:python – Is there a way to make a discord bot listen to another discord bot?python – 有没有办法让不和谐的机器人听另一个不和谐的机器人? 【发布时间】:2023-04-04 08:19:02 【问题描述】: 我正在尝试制作一个程序来创建一个无限循环,例如: bo…

    Python开发 2023年4月6日
    00
  • 解决Python报错:SyntaxError: invalid character ‘,‘ (U+FF0C)

    当Python代码中出现“SyntaxError: invalid character“,”(U+FF0C)”时,这通常是因为代码中包含了中文字符的写法错误所造成的。该错误表示Python编译器无法识别该字符,并且它可能导致代码中断或执行出现错误。以下是一些可能有用的方法来解决这个问题。 1. 修改代码文件编码格式 在代码文件的头部,添加以下注释,告诉Pyt…

    python 2023年5月13日
    00
  • Python函数参数和注解的使用

    下面是Python函数参数和注解的使用攻略: 函数参数类型 位置参数 位置参数类似于命令行参数,定义函数时需要指定参数的顺序和类型。 def add(x, y): return x + y add(1, 2) # 输出3 默认参数 默认参数在定义函数时就已经确定了默认值,在函数调用时可以不传入对应的参数值。如果传参,则会覆盖默认值。 def greeting…

    python 2023年6月5日
    00
  • 前淘宝前端开发工程师阿当的PPT中有JS技术理念问题

    首先,我们需要明确阿当PPT中JS技术理念的问题。在我的了解中,阿当在PPT中提出了一些不太正确的JS技术理念,其中包括将JS函数视为类、使用原型继承、使用全局变量等。这些理念在实际的前端开发中会导致代码无法维护、代码可靠性低、性能问题等问题。 那么该如何正确理解JS技术呢?首先要明确的是,JS是一门基于原型的面向对象编程语言,其核心对象系统是基于原型继承的…

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