23269


現在下記のようなコードで関数を並列化しています。

[code]

    lock = threading.Lock()
    for info in serverList:
        t = threading.Thread(target=getServerAsync, args=(servers, lock, info))
        t.start()
    
    mainThread = threading.currentThread()
    for t in threading.enumerate():
        if t is not mainThread:
            t.join()
    
[/code]

詳しくはわかりませんがWebアプリケーションの場合マルチスレッドで複数のリクエストを処理していると考えられます。そこで、このようなコードをWebアプリケーションの関数、例えばFlaskのルータなどで動かすと、Webアプリケーションのプログラムに悪影響等はありますか。

もし悪影響が存在するならば、悪影響を及ぼさないで並列化させるにはどのようにすればいいでしょうか。

まだ作成していませんがWebのフレームワークはFlask+gunicorn or Flask+waitressを使用する予定です。よろしくお願いします。


CC BY-SA 3.0
2016-03-10T05:22:01.840
22971
2016-03-19T02:46:14.287
7232
question
python flask
Python,Webアプリケーションでthreadingを使いたい


スレッドを使うことに問題はありませんが、gunicornのコンテナの中でさらにスレッドを生成するわけで、制御するのが難しいでしょう。非同期のタスクを走らせたいならCeleryなどを使うことをお勧めします。

リンクだけ貼るのはルール違反ですが、具体的な問題が示されているわけではないので、回答も一般論ということで。

参考: [Celery](http://docs.celeryproject.org/en/latest/getting-started/first-
steps-with-celery.html)


CC BY-SA 3.0
2016-03-10T22:53:29.647
23004
2016-03-10T23:06:39.830
2016-03-10T23:06:39.830
7837
7837
22971
answer


スレッドを配列に入れて、それをfor文を使ってjoinすることで実現できました。

[code]

    threads = []
    for info in serverList:
        t = threading(...)
        t.start()
        threads.append(t)
    
    for t in threads:
       t.join()
    
[/code]


CC BY-SA 3.0
2016-03-19T02:46:14.287
23269
2016-03-19T02:46:14.287
7232
22971
answer