从 dash 调用异步函数

问题描述 投票:0回答:2

一旦需要对单个

function
进行
await
编辑,似乎需要对一系列
functions
进行
await
编辑,直到达到添加
await
会破坏内容的程度:

我有

dash
代码,间歇性地被调用:

def get_data(symbolStr):
    print("Getting AR for", symbolStr)
    df = amp.get_data_job(symbolStr) #calls async code and need to be awaited
    return df

...

html.Div(
        dcc.Interval(id='interval1', interval = 900 * 1000, n_intervals=0),
       
    ),   
html.Div(
        dash_table.DataTable(
            id='table',
            columns=[{"name": i, "id": i} for i in magic_columns],
            editable=True,
            row_deletable=True
        ),
    ) 

@app.callback(
    [dash.dependencies.Output('table', 'data')],
    [dash.dependencies.Input('interval1', 'n_intervals')],
    [dash.dependencies.State('table', 'data')]
    )

def update_interval(n, data):
    allSymbolsDf = pd.DataFrame()

    for symbolStr in symbolsStr:
        df = get_data(symbolStr)
        allSymbolsDf = allSymbolsDf.append(df)
        time.sleep(3)
   
    return [allSymbolsDf.to_dict('rows')]

事实是,

get_data
是一个调用
function
代码
asynchronous

df = amp.get_data_job(symbolStr)

我无法将回调

update_interval
变成
asynchronous
function
(据我所知)。推荐的解决方法是什么。我的意思是,仍然保留
dash

flask async-await python-asyncio plotly-dash
2个回答
5
投票

使用 FastApi 并在侧面提供破折号时遇到了同样的情况。使用 asyncio.run()

import asyncio

async def asyn_fun(foo):
    return True if foo == "bar" else False

def sync_fun(foo):
    return asyncio.run(asyn_fun(foo))

print(sync_fun("bar"))

0
投票

您可能想看看

async-dash
。 他们在链接网站上提供了其使用示例。
由于
asyncio
并不是真正的异步 - 它只是在执行同步操作时阻止异步函数 - 这个包作为替代方案可能值得探索。
如果您遇到此错误:

ImportError: cannot import name 'escape' from 'jinja2'

请参阅 此 GitHub 问题 作为指导。

© www.soinside.com 2019 - 2024. All rights reserved.