一、多线程
在CPU不密集、IO密集的任务下,多线程可以一定程度的提升运行效率。
import threading
import time
import requests
def fetch_url(url: str)->None:
'''根据地址发起请求,获取响应
- url: 请求地址'''
response = requests.get(url)
print(f"{url}: {response.status_code}")
def fetch_urls_sequential(urls:list)->None:
start_time = time.time()
for url in urls:
fetch_url(url)
end_time = time.time()
print(f"使用单线程时间为: {end_time - start_time} 秒\n")
def fetch_urls_concurrent(urls:list)->None:
start_time = time.time()
threads = []
for url in urls:
thread = threading.Thread(target=fetch_url, args=(url,))
threads.append(thread)
thread.start()
for thread in threads:
thread.join()
end_time = time.time()
print(f"使用多线程时间为: {end_time - start_time} 秒")
if __name__ == "__main__":
urls = ["http://www.example.com"]*10
fetch_urls_sequential(urls)
fetch_urls_concurrent(urls)
www.example.com: 200
www.example.com: 200
www.example.com: 200
www.example.com: 200
www.example.com: 200
www.example.com: 200
www.example.com: 200
www.example.com: 200
www.example.com: 200
www.example.com: 200
使用单线程时间为: 10.178432703018188 秒
www.example.com: 200
www.example.com: 200
www.example.com: 200
www.example.com: 200
www.example.com: 200
www.example.com: 200
www.example.com: 200
www.example.com: 200
www.example.com: 200
www.example.com: 200
使用多线程时间为: 0.5794060230255127 秒
可以看到在IO密集型任务时,排除极端情况,使用多线程可以很大的提升程序的性能。例如在这个例子中,响应时间就相差了8倍多。
虽然在Python中有GIL保护机制,但是依然需要注意线程安全。例如(共享数据、共享设备、非原子性操作等)。可以使用锁机制、信号机制、队列、管道等等。
二、协程
协程也叫轻量级线程,协程是一种在单一线程内实现并发编程的技术。它们允许函数在执行过程