【发布时间】:2018-07-03 14:21:12
【问题描述】:
在 Python 3.6 中使用 asyncio 时,如果调用堆栈深处的一个函数是异步的,我是否需要使整个堆栈异步并在每次调用时都等待?
例如我有:
class FileDataSource:
def getData(self):
return pd.read_csv('/some/file')
class SocketDataSource:
def __init__(self, host, port):
self.reader, self.writer = yield from asyncio.open_connection(host, port)
async def getData(self):
data = await self.reader.readuntil(b'\n\n')
return data
def func1(datasource):
func2(datasource)
def func2(datasource):
func3(datasource)
def func3(datasource):
datasource.getData()
def main(host, port):
if host is None:
func1(FileDataSource())
else:
loop = asyncio.get_event_loop()
for timeout in range(1, 60):
loop.call_later(timeout, func1(SocketDataSource(host, port)))
loop.run_forever()
在上面的示例中,我是否需要将 func1 / 2 / 3 的整个调用堆栈设置为异步并等待所有它们? (恐怕答案是肯定的)
我可以将 FileDataSource 和 SocketDataSource 交替传递给 func1,还是需要根据异步调用和非异步调用更改整个调用层次结构?
设计这样一个可以作为服务器或批处理运行的东西的最佳方法是什么?
非常感谢您的所有帮助!
【问题讨论】:
-
您是否尝试过运行代码并出现错误?
-
是的 - 当我使 func[123] 异步并等待所有这些时它运行。我很好奇是否有办法不这样做 - 即无论是读取文件还是套接字,都使 getData() 接口相同。
-
我现在正在度假,但打算回到办公室尝试一下。我将发表评论以结束该主题。谢谢你的帮助!!
标签: python python-3.x python-asyncio