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技术站