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读写csv文件流程及异常解决

    首先要知道什么是CSV文件。CSV文件(Comma-Separated Values)是一种常见的纯文本文件格式,主要用于数据存储、交换和导入导出操作。它使用逗号作为分隔符,不同字段之间用逗号分割,每行代表一个数据记录。 接下来介绍如何使用Python读写CSV文件: 1. 读取CSV文件 Python内置了csv模块,可以方便地读取CSV文件。具体流程如下…

    python 2023年5月13日
    00
  • python re – 在字符之前拆分字符串

    【问题标题】:python re – split a string before a characterpython re – 在字符之前拆分字符串 【发布时间】:2023-04-06 13:04:01 【问题描述】: 如何在字符前的位置拆分字符串? 在’a’之前分割一个字符串 输入:“fffagggahhh” 输出:[“fff”, “aggg”, “ahh…

    Python开发 2023年4月7日
    00
  • python 下划线的多种应用场景总结

    Python下划线的多种应用场景总结 1. 单下划线 在Python中,单下划线前缀的变量、函数、类名等,表示这个名称是内部使用的,不应该被外部使用。具体举例: 1.1 声明私有变量 单下划线经常用来表示私有变量,即只能在类内部访问的变量,例如: class Demo: def __init__(self): self._num = 0 # _num是私有变…

    python 2023年5月14日
    00
  • python 获取图片分辨率的方法

    Python 是一个非常适合处理图片的编程语言。获取图片的分辨率是我们处理图片时经常需要用到的一个操作。下面是 Python 中获取图片分辨率的完整攻略。 安装必要的库 要使用 Python 获取图片分辨率,我们需要使用到图片处理库 PIL 或 Pillow。Pillow 是 PIL 的加强版,因此我们使用 Pillow 比使用 PIL 更好。 使用以下命令…

    python 2023年5月19日
    00
  • python进程间通信的项目实践

    关于“python进程间通信的项目实践”的完整攻略,我会从以下三个方面进行详细讲解: 进程间通信的基本原理 Python的进程间通信模块介绍 实例:使用Python模块进行进程间通信的项目实践 1. 进程间通信的基本原理 进程间通信是指在不同的进程之间传递数据或信息的过程。在操作系统中,每个进程都拥有自己独立的内存空间,因此我们需要一些特殊的机制来实现进程间…

    python 2023年5月30日
    00
  • centos 安装Python3 及对应的pip教程详解

    下面是详细的centos安装Python3及对应的pip教程详解: 准备工作 在安装Python3之前,有必要进行一些准备工作,如更新yum源和安装编译工具。 更新yum源 sudo yum -y update 安装必要的编译工具和库 sudo yum -y groupinstall ‘Development Tools’ sudo yum -y insta…

    python 2023年5月14日
    00
  • Python中的args和kwargs

    在Python的使用中,我们经常会遇到这样的函数定义: def my_func(x, y, *args, **kwargs): for arg in args: print(arg) for key, value in kwargs.items(): print(f”{key}: {value}”) 你是否好奇,这里的args和kwargs分别是什么含义呢?…

    python 2023年4月18日
    00
  • python+unittest+requests实现接口自动化的方法

    在Python中,可以使用unittest和requests库实现接口自动化测试。unittest是Python自带的单元测试框架,用于编写和运行测试用例。requests库是Python中常用的HTTP请求库,用于发送HTTP请求和处理响应。以下是详细讲解Python+unittest+requests实现接口自动化的方法的攻略,包含两个例。 编写测试用例…

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