对 python:threading.Thread 类的使用方法详解
在 Python 中,通过使用 threading
模块来实现多线程编程,而 threading.Thread
类则是其中最重要的一个类,它允许我们创建一个线程对象。
创建线程对象
threading.Thread
类的构造函数如下:
class threading.Thread(group=None, target=None, name=None, args=(), kwargs={}, *, daemon=None)
其中,group
参数已废弃,不做介绍。其他参数说明如下:
target
:要执行的线程函数。name
:线程的名称。args
:一个元组,表示要传给线程函数的位置参数(可以为空元组)。kwargs
:一个字典,表示要传给线程函数的关键字参数(可以为空字典)。daemon
:线程的守护状态。默认为None
,表示与主线程非守护线程相同;否则为True
,表示守护线程。
下面是一个简单的示例:
import threading
def print_num(num):
print(f"Num: {num}\n")
thread = threading.Thread(target=print_num, args=(10,), name="Print-Num-Thread")
在这个示例中,我们通过 threading.Thread
类创建了一个名为 Print-Num-Thread
的线程对象 thread
,并将其绑定到了 print_num
函数上(即 target
参数)。
同时,我们还使用了位置参数 10
(表示要打印的数字),将其传给了 print_num
函数(即 args
参数)。
启动线程
线程对象创建完成后,可以通过调用它的 start
方法来启动线程。例如:
import threading
def print_num(num):
print(f"Num: {num}\n")
thread = threading.Thread(target=print_num, args=(10,), name="Print-Num-Thread")
thread.start()
在这个示例中,我们调用了 thread.start()
方法来启动线程。当线程启动后,它将会自动调用 print_num
函数,并将位置参数 10
传给它。因此,这个程序将会打印出如下结果:
Num: 10
等待线程结束
如果需要等待已经启动的线程执行完成后再继续执行主线程,可以使用 join
方法。例如:
import threading
import time
def print_num(num):
time.sleep(5) # 模拟一个耗时的操作
print(f"Num: {num}\n")
thread = threading.Thread(target=print_num, args=(10,), name="Print-Num-Thread")
thread.start()
print("Waiting for Print-Num-Thread to finish...")
thread.join()
print("Print-Num-Thread has finished!")
在这个示例中,我们在 print_num
函数中添加了一个 time.sleep(5)
的语句,以模拟一个耗时的操作。在主线程中,我们启动了线程,并调用了 thread.join()
方法,以等待线程执行完成。当线程执行完成后,主线程将会打印出如下结果:
Waiting for Print-Num-Thread to finish...
Num: 10
Print-Num-Thread has finished!
示例说明
示例 1:多线程爬虫
假设我们需要同时爬取两个网页的数据,我们可以使用线程来实现多个爬虫同时运行。以下是示例代码:
import threading
import urllib.request
import time
def crawl_page(url):
print(f"Crawling {url} ...")
content = urllib.request.urlopen(url).read()
print(f"Length of {url} = {len(content)}")
t1 = threading.Thread(target=crawl_page, args=('https://www.baidu.com',))
t2 = threading.Thread(target=crawl_page, args=('https://www.python.org',))
t1.start()
t2.start()
t1.join()
t2.join()
print("All done!")
在这个示例中,我们定义了一个 crawl_page
函数,它接收一个字符串类型的 URL,并使用 urllib.request.urlopen
函数来获取网页内容。
接着,我们创建了两个线程 t1
和 t2
,分别爬取 https://www.baidu.com
和 https://www.python.org
两个网页的内容。
最后,我们调用了 t1.join()
和 t2.join()
方法,以等待两个线程执行完成,最终输出 All done!
。
示例 2:多线程计算
假设我们需要同时计算数组中每个元素的平方,我们可以使用线程来实现多个计算任务同时运行。以下是示例代码:
import threading
def calc_squares(numbers):
for num in numbers:
print(f"{num} ^ 2 = {num ** 2}")
nums1 = [1, 2, 3, 4, 5]
nums2 = [6, 7, 8, 9, 10]
t1 = threading.Thread(target=calc_squares, args=(nums1,))
t2 = threading.Thread(target=calc_squares, args=(nums2,))
t1.start()
t2.start()
t1.join()
t2.join()
print("All done!")
在这个示例中,我们定义了一个 calc_squares
函数,它接收一个数字列表 numbers
,并遍历其中的每个元素计算其平方。
接着,我们创建了两个线程 t1
和 t2
,分别计算 nums1
和 nums2
两个列表中所有元素的平方。
最后,我们调用了 t1.join()
和 t2.join()
方法,以等待两个线程执行完成,最终输出 All done!
。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:对python:threading.Thread类的使用方法详解 - Python技术站