我不知道是否有任何性能上的明顯的差異foo
和bar
之間:Python asyncio:函數或協程,使用哪個?
class Interface:
def __init__(self, loop):
self.loop = loop
def foo(self, a, b):
return self.loop.run_until_complete(self.bar(a, b))
async def bar(self, a, b):
v1 = await do_async_thing1(a)
for i in range(whatever):
do_some_syncronous_work(i)
v2 = await do_async_thing2(b, v1)
return v2
async def call_foo_bar(loop):
a = 'squid'
b = 'ink'
interface = Interface(loop)
v_foo = interface.foo(a, b)
v_bar = await interface.bar(a, b)
,但將使用run_until_complete
造成任何實際的,顯着的不同運行我的程序?我想問的是我正在構建一個接口類,它將適應可分解的「後端」,其中一些可能是異步的。我希望使用標準函數用於公共(可重用)方法接口類,因此可以爲所有代碼維護一個API,而不會混淆使用事件循環可用的異步後端)。
更新:我沒有正確檢查代碼,第一個版本是完全無效的,因此重寫。
它實際上取決於。 'Foo'將會同步執行,而'Bar'不會。可能發生的是調度/分配可能很重要,即它可能對最終用戶有所影響。 – freakish
是的,'foo()'是一個阻塞調用。 另外'run_until_complete'不能用已經運行的事件循環調用 –