Python简单线程和协程学习心得
线程和协程的区别
线程是操作系统的调度单位,是由操作系统来进行线程调度,每个线程拥有自己的内存空间,一个线程会包含多个任务的处理过程,可以实现同时执行多个任务的效果。
而协程则是在用户程序中自行切换的,每个协程之间并不存在系统线程之间的上下文切换开销,协程是一种轻量级的线程,可以在同一个线程中运行,不会让操作系统进行线程上下文的切换,且共享内存,数据通信更加方便。协程的运行结果就是协程本身,协程需要一个主函数来驱动调度协程。
Python线程
Python原生的线程支持库是_thread,而更加高级的线程支持库有threading和concurrent.futures等。threading提供了Lock、Condition、Semaphore、Event、Barrier等线程同步和通信机制,支持线程的守护和线程池管理。concurrent.futures提供了更加简单易用的线程池实现,并支持并行执行任务结果的回收。
以下是使用threading实现简单线程的示例代码:
import threading
import time
def worker(num):
print('Thread %s started!' %num)
time.sleep(1)
print('Thread %s finished!' %num)
if __name__ == '__main__':
threads = []
for i in range(5):
t = threading.Thread(target=worker, args=(i,))
threads.append(t)
t.start()
for t in threads:
t.join()
print('All threads finished!')
执行结果:
Thread 0 started!
Thread 1 started!
Thread 2 started!
Thread 3 started!
Thread 4 started!
Thread 0 finished!
Thread 2 finished!
Thread 1 finished!
Thread 3 finished!
Thread 4 finished!
All threads finished!
Python协程
Python的协程实现主要依赖于generator来实现,使用yield实现在协程中切换执行,进而实现异步调用和非首次调用的接口。
以下是使用yield实现简单的协程的示例代码:
def coroutine():
subgen = subcoroutine()
while True:
try:
subgen.send(None)
except StopIteration:
break
def subcoroutine():
while True:
event = yield
print('Event:', event)
if __name__ == '__main__':
c = coroutine()
c.send(None)
c.send('message 1')
c.send('message 2')
c.send('message 3')
执行结果:
Event: message 1
Event: message 2
Event: message 3
以上示例中,subcoroutine()方法只是一个生成器函数,不能被单独调用,coroutine()方法是调用方,将生成器函数subcoroutine()调用并在协程中执行。执行时,coroutine()方法将subcoroutine()函数调度进入协程中,并反复循环调用其返回值,直到subcoroutine()函数执行完成。只有当事件event被send执行后,才会继续执行subcoroutine()方法的yield后面的代码,而event的输出则由subcoroutine()实现。
结语
以上对Python简单线程和协程的学习心得的简介,希望能为大家提供一些帮助。如有错误或疏漏,欢迎指正。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python简单线程和协程学习心得(分享) - Python技术站