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

yizhihongxing

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中把一个图像叠加在另一个图像上的过程中,可以用OpenCV库来实现。具体步骤如下: 1.读取原图和覆盖图 import cv2 # 读取原图和覆盖图 img1 = cv2.imread("image1.png") img2 = cv2.imread("image2.png") 2.确定图像叠加的位置 # …

    python-answer 2023年3月25日
    00
  • python图片灰度化处理的几种方法

    以下是一份完整的“Python图片灰度化处理的几种方法”的攻略: Python图片灰度化处理的几种方法 简介 图片的灰度化处理可以将一张彩色图片转化为黑白灰度图片,通常用于图像处理、计算机视觉等领域。本攻略主要介绍Python中进行图片的灰度化处理的几种方法。 方法一:使用Pillow库 Pillow是Python中一个常用的图像处理库,其中的Image模块…

    python 2023年5月18日
    00
  • 使用Python NumPy的绝对偏差和绝对平均偏差

    使用Python NumPy计算绝对偏差和绝对平均偏差需要借助NumPy库中的函数,具体流程如下。 1. 导入NumPy库 要使用NumPy计算绝对偏差和绝对平均偏差,首先需要导入NumPy库。可以使用如下命令导入: import numpy as np 2. 计算绝对偏差 绝对偏差是指每个数据点与均值之间的距离的绝对值。其计算方法如下: 绝对偏差 = |x…

    python-answer 2023年3月25日
    00
  • python实现手势识别的示例(入门)

    下面是详细的攻略。 简介 手势识别是计算机视觉领域的一个重要研究方向。在实际应用中,手势识别可以被用于人机交互、智能家居控制等领域。在本文中,我们将介绍如何使用Python实现手势识别的示例代码。 环境搭建 安装Python要使用Python进行手势识别的开发,首先需要在本地安装Python。Python的官方网站是 https://www.python.o…

    python 2023年5月18日
    00
  • python如何查看网页代码

    当我们想要分析网页或者制作爬虫器时,需要查看网页源代码。Python为我们提供了查看网页源代码的能力,以下是具体的攻略。 步骤一:安装Requests库 在Python中,我们可以使用Requests库来请求网页并获取返回值。需要先安装Requests库,可以在命令行中使用如下命令进行安装: pip install requests 步骤二:使用Reques…

    python 2023年6月3日
    00
  • Python实现最短路径问题的方法

    最短路径问题是计算机科学中的一个经典问题,它的目标是在一个加权图中找到两个节点之间的最短路径。在Python中,我们可以使用Dijkstra算法和Bellman-Ford算法来解决最短路径问题。 Dijkstra算法 Dijkstra算法是一种贪心算法,它的基本思想是从起点,每次选择距离起点最近的节点,并更新与该节点相邻的节点的距离。在Python中,我们可…

    python 2023年5月14日
    00
  • python实现跳表SkipList的示例代码

    以下是“Python实现跳表SkipList的示例代码”的完整攻略。 1. 跳表SkipList的概述 跳表SkipList是一种基于链表的结构,它可以用于快速查找、插入和删除元素。跳表SkipList的时间复杂度为(log n),与平衡树的时间复杂度相当,但实现起来比平衡树简单。 2. 跳表SkipList的实现 2.1 跳表List的节点类 我们首先定义…

    python 2023年5月13日
    00
  • Python使用matplotlib绘图无法显示中文问题的解决方法

    针对“Python使用matplotlib绘图无法显示中文问题的解决方法”,我为您准备了一份完整攻略,请您耐心看完并按照步骤进行操作。 一、问题描述 在使用Python的matplotlib库绘制图表时,若其中涉及到汉字,往往会出现无法正常显示中文的问题。 二、原因分析 matplotlib库默认使用的字体是英文字体,而中文系统中使用的是中文字体。因此,需要…

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