3

Python asyncioモジュールを理解しようとしています。他の言語の同様の機能よりもはるかに複雑なようです。

ドキュメントからの抜粋は次のとおりです。

コルーチンを呼び出してもコードの実行は開始されません。これは単なるジェネレーターであり、呼び出しによって返されるコルーチン オブジェクトは実際にはジェネレーター オブジェクトであり、反復するまで何もしません。コルーチン オブジェクトの場合、実行を開始する基本的な方法が 2 つあります。別のコルーチンからコルーチンから yield を呼び出す (他のコルーチンが既に実行されていると仮定します!) か、async() 関数または BaseEventLoop を使用してその実行をスケジュールします。 create_task() メソッド。

コルーチン (およびタスク) は、イベント ループの実行中にのみ実行できます。

今回のような実行フローは Hack では実現できないということでしょうか。

function main() : void
{
    $info = Vector {};
    for ($i = 0; $i < 5; $i++) {
        $info[] = genInfo($i);
    }
 
    echo '[main] Calling Async Function'."\n";
    $asyncCall = GenVectorWaitHandle::create($info);
 
    echo '[main] Doing whatever...'."\n";
 
    echo '[main] Time To Request Async Return Information'."\n";
    $output = $asyncCall->join();
 
    // Output Vector Data
    foreach ($output as $key => $value)
    {
        echo '['.$key.'] => '.$value."\n";
    }
}
 
async function genInfo(int $id): Awaitable<String> {
    echo '[genInfo] Generating '.$id."\n";
 
    $tmp = [];
    $tmp['id'] = $id;
    $tmp['start'] = date('H:i:s');
 
    //do some heavy working.
    await SleepWaitHandle::create(mt_rand(1000000,15*1000000));
 
    $tmp['end'] = date('H:i:s');
 
    echo "[genInfo] Completed $id\n";
 
    return json_encode($tmp);
}
 
main();
 
/*
 * This is a modified example from http://kernelcurry.com/blog/asynchronous-hack/
 */
 
//Output
[genInfo] Generating 0
[genInfo] Generating 1
[genInfo] Generating 2
[genInfo] Generating 3
[genInfo] Generating 4
[main] Calling Async Function
[main] Doing whatever...
[main] Time To Request Async Return Information
[genInfo] Completed 0
[genInfo] Completed 3
[genInfo] Completed 2
[genInfo] Completed 1
[genInfo] Completed 4
[0] => {"id":0,"start":"19:46:00","end":"19:46:03"}
[1] => {"id":1,"start":"19:46:00","end":"19:46:08"}
[2] => {"id":2,"start":"19:46:00","end":"19:46:05"}
[3] => {"id":3,"start":"19:46:00","end":"19:46:04"}
[4] => {"id":4,"start":"19:46:00","end":"19:46:08"}

ご覧のとおりgenInfo()、呼び出しの直後に実行が開始され、awaitステートメントで処理が終了します。このような実行フローは、Python での実行よりもはるかに自然だと思います。

Pythonで同じことを達成する方法はありますか?

コルーチンジェネレーターを に渡す前に (実行して最初の収量に近づけるために) 1 回反復しようとしましたloop.run_until_complete()が、成功しませんでした。

4

0 に答える 0