相关疑难解决方法(0)

实际上,Python 3.3中新的"yield from"语法的主要用途是什么?

我很难将我的大脑包裹在PEP 380周围.

  1. "收益率"有用的情况是什么?
  2. 什么是经典用例?
  3. 为什么它与微线程相比?

[更新]

现在我明白了我的困难的原因.我使用过发电机,但从未真正使用过协程(由PEP-342引入).尽管有一些相似之处,但生成器和协同程序基本上是两个不同的概念.理解协同程序(不仅仅是生成器)是理解新语法的关键.

恕我直言协程是最晦涩的Python功能,大多数书籍使它看起来毫无用处和无趣.

感谢您的回答,但特别感谢agf和他与David Beazley演讲相关的评论.大卫摇滚.

python yield

349
推荐指数
7
解决办法
9万
查看次数

asyncio.ensure_future与BaseEventLoop.create_task对比简单的协同程序?

我已经看过几个关于asyncio的基本Python 3.5教程,它们以各种方式执行相同的操作.在这段代码中:

import asyncio  

async def doit(i):
    print("Start %d" % i)
    await asyncio.sleep(3)
    print("End %d" % i)
    return i

if __name__ == '__main__':
    loop = asyncio.get_event_loop()
    #futures = [asyncio.ensure_future(doit(i), loop=loop) for i in range(10)]
    #futures = [loop.create_task(doit(i)) for i in range(10)]
    futures = [doit(i) for i in range(10)]
    result = loop.run_until_complete(asyncio.gather(*futures))
    print(result)
Run Code Online (Sandbox Code Playgroud)

上面定义futures变量的所有三个变体都实现了相同的结果; 我能看到的唯一区别是,对于第三个变体,执行是乱序的(在大多数情况下这应该无关紧要).还有其他区别吗?有些情况下我不能只使用最简单的变体(协程的简单列表)吗?

python coroutine python-3.x python-asyncio python-3.5

81
推荐指数
3
解决办法
4万
查看次数

如何在现有的阻塞库中使用asyncio?

我有很少的阻止功能foo,bar我无法改变那些(一些我无法控制的内部库.与一个或多个网络服务交谈).我如何将其用作异步?我不想做以下事情.

results = []
for inp in inps:
    val = foo(inp)
    result = bar(val)
    results.append(result)
Run Code Online (Sandbox Code Playgroud)

这将是低效的,因为我foo在等待第一个输入时可以调用第二个输入,并且相同bar.如何包装它们,这样它们与ASYNCIO(即新的使用async,await语法)?

让我们假设这些函数是可重入的.即,foo当先前foo正在处理时再次调用是可以的.


更新

用可重复使用的装饰器扩展答案.点击这里举例.

def run_in_executor(f):
    @functools.wraps(f)
    def inner(*args, **kwargs):
        loop = asyncio.get_running_loop()
        return loop.run_in_executor(None, functools.partial(f, *args, **kwargs))

    return inner
Run Code Online (Sandbox Code Playgroud)

python python-3.x async-await python-asyncio python-3.5

19
推荐指数
4
解决办法
6038
查看次数

基于生成器的协程与本地协程

我刚刚阅读了PEP0492,谈论了关于协同程序的新方法,但是PEP未能让我理解基于生成器的协同程序和本机协同程序之间的区别.有人可以告诉我差异(也许有例子)?

根据我的理解,他们使用不同的单词(产量/收益率和等待/ async/yield).据我所知,在本地协程结束时,预计会产生收益,但对于基于生成器的协同程序也是如此.

python coroutine async-await python-3.5

7
推荐指数
2
解决办法
1112
查看次数