сделать правильный результат с помощью сопрограмм Python, как node.js async.parallel - PullRequest
0 голосов
/ 05 марта 2019

Я хочу сделать написание в python, например, следующие коды node.js:

async = require('async');
async.parallel({
    html: (done) => {
        //get html from url
        html = 'html codes...'
        done(null, html)
    },

    data: (done) => {
        //get data from db
        data = [
            {
                id: 1,
                name: 'Jay',
            },
            {
                id: 2,
                name: 'Jonh',
            }
        ]
        done(null, data)
    },
}, (err, result) => {
    console.log('html', result.html)
    console.log('data', result.data)
});

Вышеприведенное выполняет две параллельные задачи и возвращает результат, содержащий ключ с 'html' и 'data'to flag.

Я хочу сделать то же самое в pytnon, но я не знаю, как это сделать asyncio, см. следующие коды:

import asyncio

async def get_html():
    await asyncio.sleep(1)
    html = 'html codes...'
    return html

async def get_data():
    await asyncio.sleep(1)
    data = [
        {
            'id': 1,
            'name': 'Jay',
        },
        {
            'id': 2,
            'name': 'Jonh',
        }
    ]
    return data

async def main():
    tasks = [get_html(), get_data()]
    result = await asyncio.gather(*tasks)
    print(type(result)) # But it's a list
    # result['html']   #I want it is contains key with 'html' and 'data'
    # result['data']
    print(result[0]) # I dont know which is html
    print(result[1]) # And which is data


loop = asyncio.get_event_loop()
loop.run_until_complete(main())
loop.close()

Заранее спасибо!:)

1 Ответ

0 голосов
/ 05 марта 2019

Во-первых, вы должны использовать await с asyncio.sleep().

. Вы можете использовать следующую функцию - кредиты автору этой сущности :

async def gather_dict(tasks: dict):
    async def mark(key, coro):
        return key, await coro

    return {
        key: result
        for key, result in await gather(
            *(mark(key, coro) for key, coro in tasks.items())
        )
    }

async def main():
    result = await gather_dict({'html': get_html(), 'data': get_data()})
    print(result)

Это выполнит две сопрограммы параллельно и выведет: {'html': 'html codes...', 'data': [{'id': 1, 'name': 'Jay'}, {'id': 2, 'name': 'Jonh'}]}

...