python线程join方法原理解析

Python线程join方法原理解析

在Python中,线程是一种轻量级的执行单元,可以同时执行多个任务。线程的join方法是一种常用的线程同步方法,可以让主线程等待子线程执行完毕后再继续执行。本文将详细讲解Python线程join方法的原理和使用方法。

join方法的原理

join方法是Thread类的一个方法,用于等待线程执行完毕。当一个线程调用另一个线程的join方法时,当前线程会被阻塞,直到被调用的线程执行完毕。join方法的原理是通过线程同步机制来实现的。

在Python中,线程同步机制有多种实现方式,包括锁、信号量、事件等。join方法使用的是事件机制。当一个线程调用另一个线程的join方法时,它会创建一个事件对象,并将该事件对象传递给被调用的线程。被调用的线程在执行完毕后会触发该事件对象,通知调用线程继续执行。

join方法的使用方法

join方法的使用方法很简单,只需要在需要等待的线程对象上调用join方法即可。join方法有一个可选参数timeout,用于指定等待的时间,单位为秒。如果超过指定的时间仍然没有执行完毕,则会抛出一个异常。

以下是一个使用join方法的示例:

import threading
import time

def worker():
    print("Worker thread started")
    time.sleep(2)
    print("Worker thread finished")

t = threading.Thread(target=worker)
t.start()

print("Main thread waiting for worker thread")
t.join()
print("Main thread finished")

在上面的代码中,我们创建了一个线程t,并在该线程中执行worker函数。在主线程中,我们调用了t.join()方法,使得主线程等待线程t执行完毕后再继续执行。输出结果如下:

Worker thread started
Main thread waiting for worker thread
Worker thread finished
Main thread finished

可以看到,主线程在等待线程t执行完毕后才继续执行。

以下是一个使用join方法的示例,其中设置了超时时间:

import threading
import time

def worker():
    print("Worker thread started")
    time.sleep(5)
    print("Worker thread finished")

t = threading.Thread(target=worker)
t.start()

print("Main thread waiting for worker thread")
t.join(3)
print("Main thread finished")

在上面的代码中,我们设置了t.join(3)方法,表示等待线程t执行完毕的时间为3秒。由于worker函数中的sleep时间为5秒,因此在3秒内无法执行完毕,会抛出一个异常。输出结果如下:

Worker thread started
Main thread waiting for worker thread
Exception in thread Thread-1:
Traceback (most recent call last):
  File "/usr/local/lib/python3.7/threading.py", line 926, in _bootstrap_inner
    self.run()
  File "/usr/local/lib/python3.7/threading.py", line 870, in run
    self._target(*self._args, **self._kwargs)
  File "test.py", line 6, in worker
    time.sleep(5)
KeyboardInterrupt

Main thread finished

可以看到,由于等待时间超过了3秒,join方法抛出了一个异常。主线程在捕获异常后继续执行。

示例1:使用join方法等待多个线程执行完毕

以下是一个使用join方法等待多个线程执行完毕的示例:

import threading
import time

def worker(id):
    print("Worker thread %d started" % id)
    time.sleep(2)
    print("Worker thread %d finished" % id)

threads = []
for i in range(5):
    t = threading.Thread(target=worker, args=(i,))
    t.start()
    threads.append(t)

print("Main thread waiting for worker threads")
for t in threads:
    t.join()

print("Main thread finished")

在上面的代码中,我们创建了5个线程,并将它们添加到一个列表中。在主线程中,我们使用for循环遍历线程列表,并在每个线程上调用join方法,使得主线程等待所有线程执行完毕后再继续执行。输出结果如下:

Worker thread 0 started
Worker thread 1 started
Worker thread 2 started
Worker thread 3 started
Worker thread 4 started
Main thread waiting for worker threads
Worker thread 0 finished
Worker thread 1 finished
Worker thread 2 finished
Worker thread 3 finished
Worker thread 4 finished
Main thread finished

可以看到,主线程在等待所有线程执行完毕后才继续执行。

示例2:使用join方法实现线程池

以下是一个使用join方法实现线程池的示例:

import threading
import time
import queue

class ThreadPool:
    def __init__(self, num_threads):
        self.num_threads = num_threads
        self.queue = queue.Queue()
        self.threads = []

    def start(self):
        for i in range(self.num_threads):
            t = threading.Thread(target=self.worker)
            t.start()
            self.threads.append(t)

    def worker(self):
        while True:
            task = self.queue.get()
            if task is None:
                break
            print("Thread %d processing task %s" % (threading.get_ident(), task))
            time.sleep(2)
            print("Thread %d finished task %s" % (threading.get_ident(), task))
            self.queue.task_done()

    def submit(self, task):
        self.queue.put(task)

    def join(self):
        self.queue.join()
        for i in range(self.num_threads):
            self.queue.put(None)
        for t in self.threads:
            t.join()

pool = ThreadPool(3)
pool.start()

for i in range(10):
    pool.submit("Task %d" % i)

pool.join()

在上面的代码中,我们创建了一个ThreadPool类,用于管理线程池。在start方法中,我们创建了多个线程,并在每个线程上调用worker方法。在worker方法中,我们使用while循环不断从任务队列中获取任务,并执行任务。在submit方法中,我们将任务添加到任务队列中。在join方法中,我们等待所有任务执行完毕,并将None添加到任务队列中,以通知所有线程退出。输出结果如下:

Thread 140044947496960 processing task Task 0
Thread 140044947496960 finished task Task 0
Thread 140044939104256 processing task Task 1
Thread 140044939104256 finished task Task 1
Thread 140044930711552 processing task Task 2
Thread 140044930711552 finished task Task 2
Thread 140044947496960 processing task Task 3
Thread 140044947496960 finished task Task 3
Thread 140044939104256 processing task Task 4
Thread 140044939104256 finished task Task 4
Thread 140044930711552 processing task Task 5
Thread 140044930711552 finished task Task 5
Thread 140044947496960 processing task Task 6
Thread 140044947496960 finished task Task 6
Thread 140044939104256 processing task Task 7
Thread 140044939104256 finished task Task 7
Thread 140044930711552 processing task Task 8
Thread 140044930711552 finished task Task 8
Thread 140044947496960 processing task Task 9
Thread 140044947496960 finished task Task 9

可以看到,线程池中的多个线程并发执行任务,并且使用join方法等待所有任务执行完毕后再退出。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python线程join方法原理解析 - Python技术站

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

相关文章

  • 【manim动画教程】–高级动画效果

    在常用的动画效果中,介绍了一些元素的创建,销毁,移动和变换的方法,这些方法都是针对单个动画的。如果需要多个动画互相关联,或者元素需要有更复杂的运动方式,那么,仅仅依靠常用的动画效果可能就无法满足要求了。 本篇的高级动画效果主要介绍一些更加灵活的元素运动方式,如何组合多个动画,以及如何联动多个动画的方式。掌握了这些方法,就能够表达出更加复杂的数学几何动画。 1…

    python 2023年4月17日
    00
  • 运行python脚本更改Windows背景

    运行Python脚本来更改Windows背景可以通过以下步骤完成。 步骤1. 安装依赖模块 要运行Python脚本来更改Windows背景,首先需要安装Pillow库。Pillow库是Python中的图像处理库,它支持多种常见图像格式,可以很方便地进行图像处理操作。 可以通过以下命令来安装Pillow库: pip install Pillow 步骤2. 编写…

    python 2023年5月30日
    00
  • ImportError: No module named ‘PIL’ ( Python 3.4.3 , (1, 8, 7, ‘final’, 0)

    【问题标题】:ImportError: No module named ‘PIL’ ( Python 3.4.3 , (1, 8, 7, ‘final’, 0)ImportError: No module named ‘PIL’ ( Python 3.4.3 , (1, 8, 7, ‘final’, 0) 【发布时间】:2023-04-05 23:00:01…

    Python开发 2023年4月6日
    00
  • python argparse命令行参数解析(推荐)

    Python argparse命令行参数解析(推荐) 介绍 在Python开发中,命令行参数解析是一项非常重要的任务。Python标准库中提供了argparse模块用于解析命令行参数。argparse具有强大的功能,可以解析不同类型的参数,并根据需要生成帮助信息。 安装argparse argparse是Python标准库的一部分,因此不需要安装。我们只需要…

    python 2023年6月3日
    00
  • python基础教程之字典操作详解

    Python基础教程之字典操作详解 1. 什么是字典 在 Python 中,字典是一种可变容器模型,也可称作为键值对(key-value)存储,顾名思义,字典是由键和值组成的。 2. 字典的创建 字典的创建可以通过大括号 {} 或者 dict() 函数来实现,如下: # 通过 {} 创建字典 dict1 = {‘name’: ‘Jack’, ‘age’: 1…

    python 2023年5月13日
    00
  • python算法学习之桶排序算法实例(分块排序)

    下面是详细讲解“python算法学习之桶排序算法实例(分块排序)”的完整攻略,包含两个示例说明。 桶排序算法简介 桶算法是一种线性排序算法,它的基本思想是将数据分到有限数量的桶中,然后对每个桶中的数据进行排序,最后将所有桶中的数据依次取出,即可得到有序序列。桶排序算法适用于数据分布均的情况,时间复杂度为O(n)。 Python实现桶排序算法 下面是Pytho…

    python 2023年5月14日
    00
  • Python中X[:,0]和X[:,1]的用法

    在Python中,一般使用numpy库进行数据分析和处理。numpy库提供了多种方法对数组进行操作,如X[:,0]和X[:,1]等方法。 X[:,0]和X[:,1]表示numpy数组X中的所有行的第0列和第1列。例如,如果有一个二维的numpy数组X: import numpy as np X = np.array([[1,2,3],[4,5,6],[7,8…

    python 2023年6月6日
    00
  • Python实现ATM简单功能的示例详解

    Python实现ATM简单功能的示例详解 ATM简单功能介绍 ATM(Automated Teller Machine)自动取款机是现代化金融服务的标志之一,为人们的生活和工作带来了便捷。下面我们以Python实现ATM简单功能为例来了解ATM自动取款机操作的基本过程。 ATM简单功能大致包括: 插卡操作:用户将银行卡插入ATM机中 输入密码:用户输入银行卡…

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