Python多线程threading和multiprocessing模块实例解析

Python 多线程和多进程模块实例解析

概述

Python 是一种解释型语言,它天然支持多线程和多进程。

在 Python 中,多线程和多进程是通过 threadingmultiprocessing 两个模块来实现的。这两种技术可以帮助我们实现并发编程,提高代码的执行效率。

Python threading 模块

threading 模块提供了一种在 Python 中创建和管理线程的方式。通过 threading 模块,我们可以在 Python 中创建多个线程,并且控制线程的启动、暂停、恢复和停止等操作。

示例一:创建线程

import threading

# 自定义线程类
class MyThread(threading.Thread):
    def __init__(self, thread_id):
        super().__init__()
        self.thread_id = thread_id

    def run(self):
        for i in range(10):
            print(f"Thread {self.thread_id} - {i}")

# 创建线程
t1 = MyThread(1)
t2 = MyThread(2)

# 启动线程
t1.start()
t2.start()

# 等待线程执行完成
t1.join()
t2.join()

# 输出结果:
# Thread 1 - 0
# Thread 2 - 0
# Thread 1 - 1
# Thread 2 - 1
# Thread 1 - 2
# Thread 2 - 2
# Thread 1 - 3
# Thread 2 - 3
# Thread 1 - 4
# Thread 2 - 4
# Thread 1 - 5
# Thread 2 - 5
# Thread 1 - 6
# Thread 2 - 6
# Thread 1 - 7
# Thread 2 - 7
# Thread 1 - 8
# Thread 2 - 8
# Thread 1 - 9
# Thread 2 - 9

上面的代码中,我们定义了一个 MyThread 线程类,并在其中定义了 run 方法,在 run 方法中执行线程中的任务。然后,我们创建了两个 MyThread 对象 t1t2,启动这两个线程,并等待它们执行完成。

示例二:线程同步

import threading
import time

# 全局变量
count = 0

# 自定义线程类
class MyThread(threading.Thread):
    def __init__(self):
        super().__init__()

    def run(self):
        global count
        for i in range(1000000):
            count += 1
        time.sleep(1)

# 创建多个线程
threads = []
for i in range(10):
    t = MyThread()
    threads.append(t)

# 启动线程
for t in threads:
    t.start()

# 等待所有线程执行完成
for t in threads:
    t.join()

# 输出结果
print(f"count = {count}")

# 输出结果:count = 10000000

上面的代码中,我们定义了一个 MyThread 线程类,并在其中定义了一个 run 方法,该方法对全局变量 count 进行多次加 1 操作。我们创建了 10 个 MyThread 对象,并分别启动这些线程来进行计数。由于 count 是全局变量,多个线程会同时对其进行加 1 操作,因此需要使用锁进行线程同步。

在上面的代码中,我们使用了 threading.Lock() 对象来进行线程同步,具体实现方式是在 MyThread 类和 main 函数中分别加上锁。这样,整个 count 变量的加 1 操作就变得安全了。执行结果表明,10 个线程共同对 count 进行了 10000000 次加 1 操作,最后得到了正确的结果。

Python multiprocessing 模块

multiprocessing 模块提供了一种在 Python 中创建和管理多个进程的方式。通过 multiprocessing 模块,我们可以在 Python 中创建多个进程,并且控制进程的启动、暂停、恢复和停止等操作。

示例一:创建进程

import multiprocessing

# 自定义进程类
class MyProcess(multiprocessing.Process):
    def __init__(self, process_id):
        super().__init__()
        self.process_id = process_id

    def run(self):
        for i in range(10):
            print(f"Process {self.process_id} - {i}")

# 创建进程
p1 = MyProcess(1)
p2 = MyProcess(2)

# 启动进程
p1.start()
p2.start()

# 等待进程执行完成
p1.join()
p2.join()

# 输出结果:
# Process 1 - 0
# Process 2 - 0
# Process 1 - 1
# Process 2 - 1
# Process 1 - 2
# Process 2 - 2
# Process 1 - 3
# Process 2 - 3
# Process 1 - 4
# Process 2 - 4
# Process 1 - 5
# Process 2 - 5
# Process 1 - 6
# Process 2 - 6
# Process 1 - 7
# Process 2 - 7
# Process 1 - 8
# Process 2 - 8
# Process 1 - 9
# Process 2 - 9

上面的代码中,我们定义了一个 MyProcess 进程类,并在其中定义了 run 方法,在 run 方法中执行进程中的任务。然后,我们创建了两个 MyProcess 对象 p1p2,启动这两个进程,并等待它们执行完成。

示例二:进程池

import multiprocessing

# 进程执行函数
def worker(num):
    print("Worker %d" % num)
    return

# 创建进程池
pool = multiprocessing.Pool(processes=4)

# 启动进程
for i in range(10):
    pool.apply_async(worker, (i,))

# 关闭进程池
pool.close()
pool.join()

# 输出结果:
# Worker 0
# Worker 1
# Worker 2
# Worker 3
# Worker 4
# Worker 5
# Worker 6
# Worker 7
# Worker 8
# Worker 9

上面的代码中,我们定义了一个 worker 进程执行函数,该函数接受一个参数 num,输出一个字符串和参数 num。同时,我们创建了一个进程池 pool,该进程池使用 multiprocessing.Pool() 函数来创建,并指定最大进程数为 4。然后,我们使用 pool.apply_async() 函数向进程池提交 10 个任务,每个任务调用 worker 函数,并且传递一个参数 i。最后,我们关闭进程池,并等待所有进程执行完成。执行结果表明,10 个任务被分配给 4 个进程执行,执行结果是按顺序输出的。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python多线程threading和multiprocessing模块实例解析 - Python技术站

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

相关文章

  • Java进阶之高并发核心Selector详解

    Java进阶之高并发核心Selector详解 什么是Selector Selector 是 Java NIO 中的一部分,它是一个可以通过单个线程处理多个 Channel 的组件。 在传统的 IO 模型中,每个连接都需要独立的线程进行处理,而使用 Selector 后,可以使用一个线程来处理多个连接,从而提高了程序的并发处理能力。 Selector 的使用 …

    多线程 2023年5月17日
    00
  • MySQL中SELECT+UPDATE处理并发更新问题解决方案分享

    MySQL中SELECT+UPDATE处理并发更新问题解决方案分享 在MySQL中,常常存在多个客户端同时对同一行数据进行更新的情况,这就导致了并发更新问题,会产生脏读、幻读等问题。接下来,我们将为大家分享如何通过SELECT+UPDATE来解决并发更新问题。 解决方案 MySQL提供了多种方式来解决并发更新问题,比如使用事务或者锁机制。而在本文中,我们将介…

    多线程 2023年5月17日
    00
  • C#多线程之线程池(ThreadPool)

    C#多线程之线程池(ThreadPool) 在C#中,使用多线程可以提升程序的性能,提高程序的响应速度。然而,创建线程是有一定开销的,如果需要大量创建线程,这会降低系统的性能,因而引入了线程池(ThreadPool)的概念。线程池利用了线程的复用,重复利用已经存在的线程,在一定程度上减少了系统的开销。 在C#中,线程池提供了ThreadPool类,可以使用其…

    多线程 2023年5月17日
    00
  • Java使用JMeter进行高并发测试

    针对“Java使用JMeter进行高并发测试”的完整攻略,我给您提供以下的步骤: 步骤一:安装JMeter 在进行JMeter进行高并发测试之前,确保您已经安装了最新版的JMeter,并全面理解测试的基本理念。 步骤二:编写测试计划 在JMeter中,测试计划是用于组织所有测试元素的根元素。在编写测试计划时,请确保包括以下内容:- 负载发生器:它是我们需要检…

    多线程 2023年5月16日
    00
  • java for循环内执行多线程问题

    在Java中,循环内执行多线程可能会遇到一些问题,主要问题是多线程并不一定按照期望的顺序运行,这可能会导致程序出现不同的结果。针对这个问题,我们可以采取以下策略来解决: 一、使用线程池 我们可以使用线程池来执行多线程任务,这可以帮助我们避免创建过多的线程,提高程序的效率,并且让线程能够按照一定的顺序执行。下面是如何使用线程池来解决循环内执行多线程问题的示例代…

    多线程 2023年5月17日
    00
  • 详解Python并发编程之创建多线程的几种方法

    让我详细讲解一下“详解Python并发编程之创建多线程的几种方法”的完整攻略。 1. 为什么要使用多线程 在Python中使用多线程可以让一台计算机同时执行多个任务,从而提高程序的运行效率。具体来说,多线程可以在以下情况下使用: 需要处理大量IO密集型任务,如网络编程、读写文件等操作。 需要执行CPU密集型任务,如计算、图形渲染等操作。 需要同时处理多个任务…

    多线程 2023年5月16日
    00
  • Java并发编程学习之ThreadLocal源码详析

    首先我们需要了解什么是ThreadLocal。ThreadLocal是一个与线程相关的类,它提供了线程本地存储(ThreadLocal Storage)功能,也就是说,对于同一个ThreadLocal实例,每个线程都可以获取相同但是独立的值。这样,多个线程之间可以相互独立,不会互相冲突,实现了数据的隔离。 一、ThreadLocal如何实现线程本地存储的在讲…

    多线程 2023年5月17日
    00
  • 举例解析Java多线程编程中需要注意的一些关键点

    下面是举例解析Java多线程编程中需要注意的一些关键点的攻略。 标题 Java多线程编程中需要注意的一些关键点 起因 Java多线程编程是Java程序员必备的技能之一,也是Java语言特有的特性。但是,由于多线程编程涉及到线程安全、锁机制、可见性等复杂问题,因此在编写多线程程序时,我们需要注意一些关键点,以避免出错、提高程序的性能和可靠性。 注意点 线程安全…

    多线程 2023年5月17日
    00
合作推广
合作推广
分享本页
返回顶部