Python多线程threading join和守护线程setDeamon原理详解

Python多线程threading join和守护线程setDeamon原理详解

简介

Python多线程是Python独特的功能之一,可以使程序在同一时间内执行多个并行任务。Python的线程模块提供了两个方法join()setDaemon(),用于控制线程的行为。本文将详细介绍这两个方法的原理及使用方法。

join()方法

join()方法用于等待一个线程的结束。如果线程不能在指定的时间内完成执行,那么join()方法会使主线程等待直到子线程完成后再继续执行。例如:

import threading
import time

def worker():
    print('子线程开始执行')
    time.sleep(2)
    print('子线程执行完毕')

t = threading.Thread(target=worker)
t.start()
t.join()
print('主线程继续执行')

上面的例子中,主线程会等待子线程执行完毕后才会继续执行。如果注释掉t.join(),那么主线程会立即执行,子线程会在后台执行。

setDaemon()方法

setDaemon()方法的作用是将一个线程设置为守护线程。守护线程是一种特殊的线程,当主线程完成后,守护线程自动退出,不需要等待其他线程执行完毕。例如:

import threading
import time

def worker():
    print('子线程开始执行')
    time.sleep(5)
    print('子线程执行完毕')

t = threading.Thread(target=worker)
t.setDaemon(True)
t.start()
print('主线程结束')

上面的例子中,主线程不用等待子线程执行完毕,而是直接结束,守护线程也会随之结束。

需要注意的是设置守护线程必须在start()方法之前,否则会抛出RuntimeException异常。

示例说明

示例一:计时器

下面的示例演示了如何使用多线程创建一个简单的计时器,计时器在后台计时,用户可以同时执行其他任务:

import threading
import time

def timer():
    n = 0
    while True:
        print('计时器已经运行了 {} 秒'.format(n))
        time.sleep(1)
        n += 1

t = threading.Thread(target=timer, daemon=True)
t.start()

input('按下任意键停止计时器\n')

print('计时器已经停止')

在这个示例中,主线程等待用户输入任意键后结束,这时守护线程也随之结束,计时器也就停止了。

示例二:下载器

下面的示例演示了如何使用多线程下载网址内容:

import requests
import threading
import time

class Downloader:
    def __init__(self,url):
        self.url = url
    def download(self):
        response = requests.get(self.url)
        print(response.content.decode('utf-8'))

urls = ['http://www.baidu.com',
        'http://www.163.com',
        'http://www.taobao.com',
        'http://www.sina.com.cn',
        'http://www.jd.com'
        ]

threads = []

start_time = time.time()
for url in urls:
    t = threading.Thread(target=Downloader(url).download)
    threads.append(t)
    t.start()

for t in threads:
    t.join()
print('所有网址耗时: {:.3f}'.format(time.time() - start_time))

在这个示例中,创建了一个名为Downlader的类,它可以下载一个网址的内容。创建了五个线程,每个线程下载一个指定的网址。这样在五个线程同时下载的情况下,大大缩短了下载时间。

总结

join()setDaemon()方法是Python多线程中的两个重要方法,了解它们的机制有助于更好的理解多线程编程的本质,加速代码执行,提高程序性能的同时,也避免了一些线程安全问题的发生。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python多线程threading join和守护线程setDeamon原理详解 - Python技术站

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

相关文章

  • 彻底搞懂Java多线程(四)

    我来详细讲解一下“彻底搞懂Java多线程(四)”的完整攻略。 标题 彻底搞懂Java多线程(四) 具体内容 Java多线程中的一个重要概念就是线程池,线程池可以有效地管理线程的数量,防止资源被浪费,提高程序的性能。本篇文章将详解Java中的线程池。 线程池实现原理 Java中的线程池由Executor框架提供。Executor框架定义了ThreadPoolE…

    多线程 2023年5月17日
    00
  • Java多线程编程综合案例详解

    下面是针对“Java多线程编程综合案例详解”的完整攻略,帮助读者深入了解Java多线程编程。 Java多线程编程综合案例详解 简介 多线程编程是Java开发中非常重要的一个部分,能有效地提高程序的运行效率。本文介绍一个基于Java多线程技术的综合案例,主要包括案例的背景、功能、流程等内容。 案例背景 假设有一个银行系统,要求支持并发访问,其中主要包含两个功能…

    多线程 2023年5月17日
    00
  • Java 详解循环屏障CyclicBarrier如何实现多线程分段等待执行完成

    让我来详细给你讲解一下“Java 详解循环屏障CyclicBarrier如何实现多线程分段等待执行完成”的攻略。 CyclicBarrier 是什么? 在 Java 语言中,CyclicBarrier 是一个同步辅助类,能够让一组线程同时到达一个屏障(也称栅栏)位置,然后再一起继续执行。其实,CyclicBarrier 就是一个字面意义的循环屏障。 如何使用…

    多线程 2023年5月16日
    00
  • C++中的并行与并发基础与使用详解

    C++中的并行与并发基础与使用详解 什么是并行与并发? 并行:同时执行多个任务,多个任务之间相互独立,无需相互协作。 并发:多个任务交替执行,但是任务之间需要通过同步机制来进行协作。 C++中的并行与并发 C++11 提供了许多并行化和并发化的工具,如线程,原子,互斥量等,这些工具都在 std 命名空间中。我们需要包含 <thread>, &lt…

    多线程 2023年5月16日
    00
  • Java中对于并发问题的处理思路分享

    Java中对于并发问题的处理思路分享 多线程编程 在Java中,实现多线程编程主要通过 Thread 类或者实现 Runnable 接口来完成。创建和启动线程的方式有两种: 继承 Thread 类 class MyThread extends Thread { @Override public void run() { // 线程执行逻辑 } } MyThr…

    多线程 2023年5月16日
    00
  • Kotlin使用协程实现高效并发程序流程详解

    Kotlin使用协程实现高效并发程序流程详解 什么是协程? 协程是一种轻量级的并发机制,可以让我们像编写同步代码一样编写异步代码。在 Kotlin 中,协程由 kotlinx.coroutines 库提供,可以通过将 suspend 函数与 coroutine builder(例如 launch、async等)结合使用来实现。 协程的实现原理 协程的实现依赖…

    多线程 2023年5月17日
    00
  • 浅析Disruptor高性能线程消息传递并发框架

    浅析Disruptor高性能线程消息传递并发框架 Disruptor是一个高性能线程消息传递并发框架,它的操作主要是在内存中进行,最早由LMAX Exchange公司开源,并且在金融领域得到广泛应用。Disruptor与传统的生产者/消费者模式相比,最大的优势在于它可以避免锁竞争、缓存不命中等问题,从而获得更高的性能。 Disruptor的核心概念 Ring…

    多线程 2023年5月16日
    00
  • 解决线程并发redisson使用遇到的坑

    下面是“解决线程并发redisson使用遇到的坑”的完整攻略。 问题描述 在使用 Redisson 实现分布式锁时,遇到了线程并发问题。多个线程同时获取锁并执行业务逻辑,但是在释放锁之前,会有其他线程获取到锁,进而导致同一份数据被多个线程同时操作,最终导致了数据的不一致性。 解决方案 1. 针对锁失效问题 在 Redisson 中,锁可以设置失效时间和等待时…

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