2016-10-17 9 views
2

ピラミッドビューでasyncioサブプロセスを実行しようとしていますが、ビューがハングし、非同期タスクが完了しないように見えます。私はピラミッドビューの外でこの例を実行することができ、それは動作します。それとピラミッドビューのAsyncioサブプロセスの使用

は、私はもともとloop = asyncio.get_event_loop()を使用してテストしているが、これは、私は完全にここで理解していないものは確かにありますRuntimeError: There is no current event loop in thread 'Dummy-2'

私に語ったと述べました。ビュースレッドがメインスレッドと異なる場合がありますので、get_event_loopは機能しません。

私の非同期タスクがこのシナリオでその結果をもたらさない理由を誰かが知っていますか?これは単純な例です。

@asyncio.coroutine 
def async_task(dir): 
    # This task can be of varying length for each handled directory 
    print("Async task start") 
    create = asyncio.create_subprocess_exec(
     'ls', 
     '-l', 
     dir, 
     stdout=asyncio.subprocess.PIPE) 
    proc = yield from create 

    # Wait for the subprocess exit 
    data = yield from proc.stdout.read() 
    exitcode = yield from proc.wait() 
    return (exitcode, data) 


@view_config(
    route_name='test_async', 
    request_method='GET', 
    renderer='json' 
) 
def test_async(request): 
    loop = asyncio.new_event_loop() 
    asyncio.set_event_loop(loop) 
    dirs = ['/tmp/1/', '/tmp/2/', '/tmp/3/'] 
    tasks = [] 
    for dir in dirs: 
     tasks.append(asyncio.ensure_future(async_task(dir), loop=loop)) 

    loop.run_until_complete(asyncio.gather(*tasks)) 
    loop.close() 
    return 
+1

ピラミッドフレームワークはasyncioと互換性がありません。それらを一緒に使用する理由はありません。 –

+0

私はそれがこのようなものかもしれないと感じました。私はまだ興味があるのですか?私は、uWSGIサーバーがasyncioを使用するための実験的な機能を持っていることに気付きました。 – sdk900

+0

No.ピラミッドはWSGIフレームワークです。 WSGIは標準定義と同期しています。 –

答えて

2

loop.run_until_completeをあなたのビューで呼び出すと、完了するまでブロックされます。

WSGIアプリケーションでasyncioを使用する場合は、別のスレッドでasyncioを使用する必要があります。たとえば、イベントループを含むスレッドをスピンアップして、非同期コードを実行することができます。 WSGIコードはすべて同期的なので、どのような非同期コードでもこのようにしなければなりません。独自の問題を持っていなければなりません。

+0

私は実際にブロックして大丈夫です。私のコードで持っている非単純な例として、ファイルのリストにサブプロセスがあります。各ファイルはサイズが異なり、処理時間が異なります。タスクを並行して実行することは、効率的なジョブの実行方法です。 – sdk900

関連する問題