python 多进程和多线程使用详解

Python 多进程和多线程使用详解

Python 作为一门高级语言,在并发编程方面拥有很好的支持。在多进程和多线程方面,Python 同样提供了丰富的标准库支持。在本文中,我们将详细讲解并发编程中的多进程和多线程的使用。

多进程

基本概念

多进程是指在一个程序中同时运行多个并发执行的任务,每个任务拥有独立的进程空间。在 Python 中,我们可以通过创建多个进程来实现多进程,并且 Python 提供了 multiprocessing 模块用于实现多进程。

示例一:快速创建多进程

在 Python 中,使用 Process 类可以创建一个新的进程。下面的代码展示了如何快速创建多个进程:

import os
from multiprocessing import Process

def func(name):
    print('process %s start' % name)
    print('parent process id:', os.getppid())
    print('process id:', os.getpid())
    print('process %s end' % name)

if __name__ == '__main__':
    for i in range(5):
        p = Process(target=func, args=(str(i),))
        p.start()
        p.join()
    print('main process end')

这里定义了一个 func 函数,参数为进程的名称。使用 Process 类创建进程时,需要指定参数 targetargstarget 参数用于指定进程要执行的函数,args 参数是传入该函数的参数组成的元组。

在创建多个进程后,可以使用 join() 方法使主进程等待所有进程完成。这样可以确保进程间的执行顺序,避免出现混乱的输出结果。

示例二:多进程共享变量

在多进程编程中,可以使用 ValueArray 类来共享变量。它们分别是通过共享一个 ctypes 类型的数据块实现的。

下面的代码展示了如何使用 Value 共享一个数值:

from multiprocessing import Process, Value

def f(n):
    for i in range(10):
        n.value += 1

if __name__ == '__main__':
    num = Value('i', 0)
    ps = []
    for i in range(5):
        p = Process(target=f, args=(num,))
        p.start()
        ps.append(p)
    for p in ps:
        p.join()
    print(num.value)

这里定义了一个 f 函数,在该函数中,将共享变量 n 的值增加 10 次。在主函数中,我们使用 Value 创建一个数值类型的共享变量,然后创建多个进程并启动它们,每个进程都执行 f 函数,修改该共享变量的值。

最后,我们使用 join() 方法等待所有进程执行结束,并输出共享变量的值。

多线程

基本概念

多线程是指在一个进程中同时运行多个并发执行的任务,每个任务拥有独立的线程空间。在 Python 中,我们可以通过创建多个线程来实现多线程,并且 Python 提供了 threading 模块用于实现多线程。

示例三:快速创建多线程

在 Python 中,使用 Thread 类可以创建一个新的线程。下面的代码展示了如何快速创建多个线程:

import threading

def func(name):
    print('thread %s start' % name)
    print('thread %s end' % name)

if __name__ == '__main__':
    ts = []
    for i in range(5):
        t = threading.Thread(target=func, args=(str(i),))
        t.start()
        ts.append(t)
    for t in ts:
        t.join()
    print('main thread end')

这里定义了一个 func 函数,参数为线程的名称。使用 Thread 类创建线程时,需要指定参数 targetargstarget 参数用于指定线程要执行的函数,args 参数是传入该函数的参数组成的元组。

在创建多个线程后,可以使用 join() 方法使主线程等待所有线程完成。这样可以确保线程间的执行顺序,避免出现混乱的输出结果。

示例四:多线程共享变量

在多线程编程中,可以使用 Lock 类来同步多个线程对共享变量的访问,避免出现竞争状态。下面的代码展示了如何使用 Lock 同步多个线程对共享变量的访问:

import threading

class Counter(object):
    def __init__(self):
        self._value = 0
        self._lock = threading.Lock()

    def increment(self):
        with self._lock:
            self._value += 1

    @property
    def value(self):
        with self._lock:
            return self._value

def worker(counter):
    for i in range(10000):
        counter.increment()

if __name__ == '__main__':
    counter = Counter()
    ts = []
    for i in range(5):
        t = threading.Thread(target=worker, args=(counter,))
        t.start()
        ts.append(t)
    for t in ts:
        t.join()
    print(counter.value)

这里定义了一个 Counter 类,用于封装共享变量 valuelock 对象。在 increment 方法中,使用 with 语句实现线程安全的自增操作;在 value 属性中,也使用 with 语句实现线程安全的读取操作。

在主函数中,我们创建一个 Counter 对象,并启动多个线程,每个线程都执行 worker 函数,调用 increment 方法修改共享变量的值。

最后,我们使用 join() 方法等待所有线程执行结束,并输出共享变量的值。

总结

本文详细讲解了 Python 中多进程和多线程的使用方法和注意事项,包括快速创建多进程/多线程、多进程/多线程共享变量等内容。使用多进程和多线程可以提高程序的并发性和效率,是 Python 并发编程中的核心知识点。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python 多进程和多线程使用详解 - Python技术站

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

相关文章

  • python中如何进行连乘计算

    要在Python中进行连乘计算,可以使用for循环来实现。这里我们将使用两条示例来说明。 示例一 步骤1:指定要连乘的列表 首先,我们需要指定要进行连乘计算的数字列表。这里,我们创建一个包含整数1到5的列表。 nums = [1, 2, 3, 4, 5] 步骤2:通过for循环计算连乘积 接下来,我们可以使用一个for循环来计算这个列表中所有数字的连乘积。这…

    python 2023年5月18日
    00
  • Python爬虫实现vip电影下载的示例代码

    Python爬虫实现vip电影下载的示例代码,是指使用Python语言编写爬虫程序,模拟浏览器行为,实现获取VIP电影下载链接,从而实现免费下载VIP电影的功能。以下是该攻略的完整步骤。 确定目标网站 首先,需要确定一个目标网站,该网站提供VIP电影的下载链接,如爱奇艺、腾讯视频等。这里以腾讯视频为例。 分析网页源代码 使用浏览器开发者工具(Chrome浏览…

    python 2023年5月14日
    00
  • python鼠标绘图附代码

    下面我将向你详细讲解如何使用Python进行鼠标绘图,附带代码示例。 1. 准备工作 在使用Python进行鼠标绘图之前,我们需要安装相应的第三方库matplotlib和numpy。你可以通过以下命令来安装: pip install matplotlib numpy 2. 鼠标绘图的基本流程 鼠标绘图的基本流程如下: 导入相关库和模块 创建画布和坐标轴 绘制…

    python 2023年5月19日
    00
  • 实例讲解Python中函数的调用与定义

    我来详细讲解一下Python中函数的调用与定义的攻略。 函数的定义 在Python中,我们可以用def关键字来定义一个函数。 下面是一个简单的例子,展示如何定义一个函数: #定义一个函数 def say_hello(): print("Hello Python!") def关键字告诉了Python我们要定义一个函数,say_hello是函…

    python 2023年5月19日
    00
  • Python 打包多项数据并映射

    Python 打包多项数据并映射,可以通过字典(dict)来实现。下面是实现的方法以及示例说明。 方法 定义多个变量 使用字典打包这些变量 使用变量名作为字典的键,变量的值作为字典的值 使用字典键名来访问值 示例 示例1: 打包多项基础数据 以下是一个示例,展示如何将姓名,年龄和性别打包为字典以及如何访问字典键值: name = ‘Bob’ age = 25…

    python-answer 2023年3月25日
    00
  • 不管你的Python报什么错,用这个模块就能正常运行

    在Python编程中,我们经常会遇到各种各样的错误,这些错误可能是由于代码逻辑问题、语法错误、依赖库缺失等原因引起的。有时候,我们可能会遇到一些奇怪的错误,这些错误可能会让我们束手无策。不过,有一个名为try-except的Python模块,可以帮助我们解决这些问题。本攻略将提供使用try-except模块的完整攻略,并提供两个示例。 解决方法 以下是使用t…

    python 2023年5月13日
    00
  • python基础之模块的导入

    下面是关于“Python基础之模块的导入”的详细讲解,包括模块导入的方法和示例说明。 什么是模块? 在 Python 中,一个程序文件被称为模块。一个模块是一个包含 Python 定义和语句的文件,其名称以 .py 结尾。模块使我们能够组织代码,使其易于理解和使用。我们可以定义功能相似的代码块在同一个模块中,然后在我们的程序中导入它们,而不必在程序中多次重复…

    python 2023年6月3日
    00
  • python方向键控制上下左右代码

    下面是详细讲解“Python方向键控制上下左右代码”的完整攻略。 概述 我们可以使用Python编写代码来让方向键控制上下左右。具体来说,我们可以使用curses库来捕获键盘输入,并根据输入来移动光标。 安装 curses 库 首先,我们需要安装curses库。在终端中运行以下命令: sudo apt-get install libncurses5-dev …

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