繁体   English   中英

下一个异步生成器

[英]Async generator with next

我有以下代码:

def is_it_bad(word):
    try:
        res = next((item for item in all_names if str(word) in str(item["name"])))
    except:
        res = {'name':word, 'gender':2}
return res

看起来它阻止了正在调用is_it_bad的异步函数。 我对异步不是很熟悉,有什么方法可以使该功能不受阻碍吗?

函数调用is_it_bad

async def get_genders_by_dict(res):
    letters = re.compile('[^a-zA-Z\ ]')
    fname = unidecode(str(letters.sub('', res['full_name'])).lower())
    fname = letters.sub('', res['username']).lower() + ' ' + fname + ' ' + fname.replace(' ', '')
    fname = fname.split(' ')    
    genders = []
    for j in fname:
        if len(j) > 2:
            print(j)
            genders.append(is_it_bad_tst('_' + j + '_')['gender'])
            for k in genders:
                if int(k) != 2:
                    gender = k
                    print('GOOD: ', '_' + j + '_', gender)


async def get_genders_by_dict_main(loop):
    tasks = [get_genders_by_dict(res) for res in results]
    await asyncio.gather(*tasks)


loop = asyncio.get_event_loop()
loop.run_until_complete(get_genders_by_dict_main(loop))

使此功能无阻塞?

asyncio阻塞环境中,该功能花费大量时间等待与网络相关的操作(当您从Web请求某些内容时),或者是花费大量CPU时间(长时间计算)的功能。

通常,您可以使用asyncio并发运行与网络相关的操作,从而更快地获得结果。 asyncio执行程序 (进程池)中运行它们之外, asyncio不能以某种方式加速与CPU相关的操作,从而获得多个内核的好处。 然而,可以使用纯ProcessPoolExecutor实现,而无需asyncio

据我所知,您的代码与所描述的情况无关: get_genders_by_dict与网络无关,它似乎不包含可以在多个内核上并行化的长时间运行的计算。 阅读此答案以获取详细说明。

长话短说,如果我不缺少任何东西,那么您根本不需要asyncio ,就没有使用它的感觉。 只需将get_genders_by_dict一个普通函数并如此使用即可。

我从您的代码中看到的是您正在执行CPU受限调用,并且它可能阻塞反应堆(循环),我认为解决问题的更好方法是使用多处理或仅使用包装器在执行程序中运行任务(另一个处理)

https://docs.python.org/3/library/asyncio-eventloop.html#executor

https://docs.python.org/3/library/concurrent.futures.html#processpoolexecutor

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM