下面我将详细讲解“Python多线程的使用详情”的完整攻略。
Python多线程的使用
什么是多线程?
多线程是指在一个进程中同时运行多个线程。线程是操作系统能够进行运算调度的最小单位。
Python中用Thread
类可创建线程,用start()
方法启动线程,当线程启动后会执行run()
函数,这个过程是由操作系统自动完成的,我们只需关注自己写的代码即可。
多线程如何使用?
在Python中,多线程的实现比较简单,只需引入内建的threading
模块即可。
import threading
def func():
print("hello world")
t = threading.Thread(target=func)
t.start()
使用threading.Thread
创建线程对象,将要执行的函数传递给target
参数,然后调用start()
方法执行。
示例一:
下面以多线程下载网络图片为例,在主线程中开启子线程实现同时下载多张网络图片。之后主线程根据图片下载完成的状态对图片进行保存,并统计下载用时。
import requests
import threading
import time
IMG_URLS = [
"https://www.python.org/static/apple-touch-icon-144x144-precomposed.png",
"https://www.python.org/static/apple-touch-icon-152x152-precomposed.png",
"https://www.python.org/static/apple-touch-icon-120x120-precomposed.png",
"https://www.python.org/static/apple-touch-icon-76x76-precomposed.png",
"https://www.python.org/static/apple-touch-icon-precomposed.png",
"https://www.python.org/static/favicon.ico",
]
def download_img(url):
response = requests.get(url)
with open(url.split("/")[-1], "wb") as f:
f.write(response.content)
start_time = time.time()
threads = []
for url in IMG_URLS:
t = threading.Thread(target=download_img, args=(url,))
threads.append(t)
t.start()
for t in threads:
t.join()
print("Downloaded %d images in %.2f seconds." % (len(IMG_URLS), time.time() - start_time))
代码中定义了一个列表IMG_URLS
,里面存储了多个网络图片的URL。download_img()
函数传入一个URL参数,使用requests
包获取网络图片内容,并保存在本地。
在主线程中通过循环创建多个线程,然后调用start()
方法执行。最后在主线程中等待所有线程执行完成,统计下载用时。
注意:由于线程在获取图片后需要对本地文件进行操作,故需要加上线程锁。
示例二:
下面以多线程计算质数为例,使用多线程实现同时计算。主线程统计计算用时。
import threading
import time
def is_prime(num):
# 假想这个函数用于判断一个数是否为质数
for i in range(2, int(num ** 0.5) + 1):
if num % i == 0:
return False
return True
def thread_compute(start, end):
prime_list = []
for i in range(start, end):
if is_prime(i):
prime_list.append(i)
return prime_list
def main():
start_time = time.time()
thread_count = 4
total_num = 100000
interval = total_num // thread_count
threads = []
for i in range(thread_count):
start = i * interval + 1
end = (i + 1) * interval + 1
t = threading.Thread(target=thread_compute, args=(start, end))
threads.append(t)
t.start()
prime_list = []
for thread in threads:
prime_list += thread.join()
print("There are %d primes." % len(prime_list))
print("Time cost: %.5fs" % (time.time() - start_time))
if __name__ == '__main__':
main()
在代码中,定义了一个检测一个数是否为质数的函数is_prime()
。接着定义了另一个函数thread_compute()
,用于多线程计算质数。
在主函数main()
中创建多个线程,将质数计算任务划分在不同的线程中并执行。最后等待所有的子线程完成后将计算结果收集后输出。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python多线程的使用详情 - Python技术站