首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >第一次使用异步

第一次使用异步
EN

Stack Overflow用户
提问于 2015-12-20 20:33:05
回答 1查看 340关注 0票数 1

我正在学习python-asyncio,我正在尝试编写一个简单的模型。

我有一个处理任务的函数。在处理过程中,它会转到另一个远程服务获取数据,然后打印一条消息。

我的代码:

代码语言:javascript
复制
dd = 0

@asyncio.coroutine
def slow_operation():
    global dd
    dd += 1
    print('Future is started!', dd)
    yield from asyncio.sleep(10 - dd)  # request to another server
    print('Future is done!', dd)

def add():
    while True:
        time.sleep(1)
        asyncio.ensure_future(slow_operation(), loop=loop)

loop = asyncio.get_event_loop()
future = asyncio.Future()
asyncio.ensure_future(slow_operation(), loop=loop)
th.Thread(target=add).start()
loop.run_forever()

但是,这段代码在睡觉时不会切换上下文:

代码语言:javascript
复制
yield from asyncio.sleep(10 - dd)

我怎么才能解决呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-12-21 08:17:58

未来并不是线程安全的,这就是为什么slow_operation任务应该启动的原因。使用线程安全

代码语言:javascript
复制
    callback = lambda: asyncio.ensure_future(slow_operation(), loop=loop)
    loop.call_soon_threadsafe(cb)

如果运行python3.5.1,也可以使用线程安全

代码语言:javascript
复制
    asyncio.run_coroutine_threadsafe(slow_operation(), loop)

但是,您可能应该将线程的使用保持在最低限度。除非在自己的线程中使用运行任务的库,否则所有代码都应该在事件循环中运行(或者在执行器中运行,请参见遗嘱执行人)。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34385542

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档