下面是详细讲解“Python的多线程原来可以这样解”的完整攻略。
什么是多线程?
多线程是指一个进程(程序)中包含多个并发执行的流,每一个流都称为一个线程(Thread),多线程可以将程序中的计算密集型和I/O密集型工作分别交给不同的线程负责,从而提高程序的并发性和效率。
Python中的多线程
Python中的多线程是通过操作系统的线程实现的,Python解释器中包含了全局解释器锁(GIL),这个锁的存在会导致同一时刻只有一个线程能够执行Python字节码,这就意味着Python中的多线程不能真正的实现并行计算,但是Python中的多线程仍然可以用于I/O密集型任务的并发处理,因为在I/O操作的过程中,线程会阻塞等待I/O完成返回结果,期间可以切换到其他线程处于运行状态,从而提高并发性能。
在Python标准库中,提供了两个模块实现多线程:threading
和multiprocessing
模块。
使用threading
模块实现多线程
使用threading
模块实现多线程比较简单,可以直接创建一个线程对象,指定需要执行的函数,调用start()
方法启动线程。
下面是一个使用threading
模块实现多线程的示例代码:
import threading
import time
def worker():
"""线程函数"""
print("Thread %s is running..." % threading.current_thread().name)
time.sleep(1)
print("Thread %s is done." % threading.current_thread().name)
if __name__ == "__main__":
for i in range(5):
t = threading.Thread(target=worker)
t.start()
以上代码创建了5个线程,每个线程执行worker()
函数,worker()
函数会输出线程的名称,然后睡眠1秒钟,最后输出线程名称表示线程任务完成。
使用concurrent.futures
模块实现多线程
concurrent.futures
模块是Python3.2引入的一个新模块,目的是提供异步执行的接口,包含两个类:ThreadPoolExecutor
和ProcessPoolExecutor
,分别提供了线程池和进程池的实现。
下面是一个使用ThreadPoolExecutor
实现多线程的示例代码:
import concurrent.futures
import time
def worker():
"""线程任务函数"""
print("Thread %s is running..." % threading.current_thread().name)
time.sleep(1)
return "Thread %s result." % threading.current_thread().name
if __name__ == "__main__":
with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor:
future_to_url = {executor.submit(worker): i for i in range(5)}
for future in concurrent.futures.as_completed(future_to_url):
url = future_to_url[future]
try:
data = future.result()
except Exception as exc:
print('%r generated an exception: %s' % (url, exc))
else:
print('%r page size is %d' % (url, len(data)))
以上代码创建了一个ThreadPoolExecutor
对象,并设置最大工作线程数为5,然后通过executor.submit()
方法提交了5个线程任务,将执行结果保存到future
对象中,在for
循环中通过future.result()
方法获取每个线程任务的执行结果,最后输出结果。
总结
通过对比可以发现,使用concurrent.futures
模块实现多线程比使用threading
模块实现多线程,更加简单易用,可以很方便的实现并发执行任务,如果需要实现异步I/O操作或者并发计算密集型任务时,就可以采用这个模块。
以上就是Python的多线程攻略的详细讲解,希望可以对大家有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python的多线程原来可以这样解 - Python技术站