使用asyncio 包进行并发
抨击线程的往往是系统程序员,他们考虑的使用场景对一般的应用程序员来说,也许
一生都不会遇到……应用程序员遇到的使用场景,99% 的情况下只需知道如何派生
一堆独立的线程,然后用队列收集结果
——Michele Simionato 深度思考 Python 的人
在别的博客中讲了使用concurrent.futures 模块处理并发, 里面也有将阻塞函数变为非阻塞函数。
这里使用asyncio 包来处理并发, 两个中都有期物, future的概念。 期物是基础。
相比较concurrent.futures 而言, asyncio 用于协程实现并发
协程替代多线程实现动画
import asyncio
import itertools
import sys
@asyncio.coroutine
def spin(msg):
write, flush = sys.stdout.write, sys.stdout.flush
for char in itertools.cycle('|/-\\'):
status = char + ' ' + msg
write(status)
flush()
write('\x08' * len(status))
try:
yield from asyncio.sleep(.1)
except asyncio.CancelledError:
break
write(' ' * len(status) + '\x08' * len(status))
@asyncio.coroutine
def slow_function():
# 假装等待I/O一段时间
# yield from asyncio.sleep(3)
yield from asyncio.sleep(3) # 把控制权交给主循环,在休眠结束之后恢复这个协程
return 5 # 协程中获取的值都是return 中的值
@asyncio.coroutine
def supervisor():
# asyncio.async() 函数排定spin协程的运行时间, 使用一个task对象包装spin协程并立即返回
spinner = asyncio.async(spin('thinking!'))
print('spinner object:', spinner)
result = yield from slow_function()
spinner.cancel()
return result
def main():
loop = asyncio.get_event_loop()
result = loop.run_until_complete(supervisor())
loop.close()
print('Answer:', result)
if __name__ == '__main__':
main()
@asyncio.coroutine 这个装饰器不会预激协程。
线程函数
def supervisor():
signal = Signal()
spinner = threading.Thread(target=spin,
args=('thinking!', signal))
print('spinner object:', spinner)
spinner.start()
result = slow_function()
signal.go = False
spin
版权声明:本文为yangxiaodong88原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。