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并发编程之死锁相关知识整理

    Java并发编程之死锁相关知识整理 什么是死锁? 死锁是指两个或多个线程在执行过程中,因互相竞争资源而造成的一种互相等待的现象,若无外力干涉势将无法推进下去。 什么情况下会发生死锁? 当系统资源不足时,进程会因争夺资源而陷入僵局。若此时系统能够协调资源分配,以便令进程有序地进行,便可避免进程间死锁的发生。 在Java并发编程中,一般出现死锁的情况是因为线程之…

    多线程 2023年5月16日
    00
  • Java并发编程之Fork/Join框架的理解

    Java并发编程之Fork/Join框架的理解 什么是Fork/Join框架? Fork/Join框架是Java7引入的一种并行执行任务的机制,它通过将一个大任务分割成若干个小任务来并行地执行这些小任务,最终把这些小任务的结果合并起来得到大任务的结果。这种方式可以充分利用多核处理器的性能,加速任务执行速度,是一种高效的多线程编程方式。 Fork/Join框架…

    多线程 2023年5月16日
    00
  • Java实现多线程同步五种方法详解

    Java实现多线程同步五种方法详解 什么是多线程同步 在多线程编程中,多个线程访问相同的共享数据时,可能会导致数据异常,因此需要实现多线程同步,以保证数据的正确性。多线程同步的基本思路是,在一个线程访问共享数据时,其他线程不能访问该数据,待该线程访问完毕后,其他线程才能访问该数据。 实现多线程同步的五种方法 Java实现多线程同步的方法较多,下面列举了常用的…

    多线程 2023年5月17日
    00
  • 深入解析Java并发程序中线程的同步与线程锁的使用

    深入解析Java并发程序中线程的同步与线程锁的使用 Java是一门多线程语言,因此并发编程是Java编程中的一个重要方面。当多线程并发访问共享资源时,可能会出现线程安全问题,这时就需要用到线程同步和线程锁。本文将深入讲解Java并发程序中线程的同步与线程锁的使用,以及如何解决线程安全问题。 线程同步 线程同步是指多个线程在访问共享资源时,通过某种方式保证同一…

    多线程 2023年5月16日
    00
  • Java并发系列之AbstractQueuedSynchronizer源码分析(概要分析)

    让我来为您详细讲解“Java并发系列之AbstractQueuedSynchronizer源码分析(概要分析)”的攻略且提供两条示例说明。 1. 概要分析 1.1 AQS简介 AQS(AbstractQueuedSynchronizer)是java.util.concurrent(J.U.C)中的一个关键内部类,是JUC包中实现各种同步器的基础。AQS是实现…

    多线程 2023年5月17日
    00
  • C#多线程系列之线程池

    C#多线程系列之线程池是一个常用的多线程技术,它可以提高应用程序的性能和效率,并且减少资源和时间的浪费。下面,请允许我详细介绍如何正确地使用线程池。 线程池是什么? 线程池是一种预先创建的线程集合,用于处理应用程序中的多个并发任务。它可以减少线程创建和销毁的开销,并提高多线程应用程序的可靠性。 如何使用线程池? 使用线程池的步骤如下: 创建一个ThreadP…

    多线程 2023年5月17日
    00
  • 基于rocketmq的有序消费模式和并发消费模式的区别说明

    基于RocketMQ的有序消费模式和并发消费模式的区别说明 1. 有序消费模式 在有序消费模式下,消息消费是按照消息的发送顺序依次进行的。具体实现方式是,消息生产者将消息发送到同一个Message Queue中,而Message Queue按照顺序将消息发送给Consumer进行消费。因此,在有序消费模式下,同一个Message Queue的消息一定会按照发…

    多线程 2023年5月17日
    00
  • mysql中insert并发问题(on DUPLICATE KEY UPDATE)

    MySQL中的INSERT操作是非常常见的操作,但是在高并发的情况下,INSERT操作可能会出现一些问题,这就是INSERT并发问题。具体来说,当多个用户同时向一个表中进行INSERT操作时,就会有并发问题出现,可能会导致数据错乱、重复插入等问题。为了解决这个问题,MySQL引入了一个非常有用的特性:ON DUPLICATE KEY UPDATE。 ON D…

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