0

Python での同時実行に対する高レベルのインターフェイスを提供するライブラリは何ですか? 必ずしも複数のコアを利用するつもりはありません.GILがすべてをシリアル化するのであれば、それで問題ありません。並行性へのよりスムーズで高レベルのインターフェースが欲しいだけです。

私のアプリケーションは私たちのソフトウェアのテストを書いています。たとえば、複数のシミュレートされたユーザーと、バックエンドに変更を加えるコードをすべて並行して実行したいと思うことがあります。たとえば、次のようなことができれば素晴らしいと思います。

setup_front_end()
setup_back_end()
parallel:
   while some_condition():
      os.system('wget http://...')
      sleep(1)
   for x in xrange(10):
      os.system('top >> top.log')
      sleep(1)
   for x in xrange(100):
      mess_with_backend()

上記のコードの考え方は、3 つのスレッドを開始し、最初のスレッドが実行されるというものです。

while some_condition():
   os.system('wget http://...')
   sleep(1)

2 番目のループは 2 番目のループを実行し、3 番目のループは 3 番目のループを実行します。

それほど単純ではないことはわかっていますが、関数の作成、スレッドのスピンアップ、それらへの参加などの単調な作業を取り除くことができるものはありますか?

4

2 に答える 2

0

Thread の作成とパラメーターの設定の複雑さを隠したい場合は、単純なデコレーターを作成して関数に使用します。

async.py:

from threading import Thread
class async(object):
    def __init__(self, func):
        self.func = func

    def __call__(self, *args, **kwargs):
        Thread(target=self.func, args=args, kwargs=kwargs).start()

これは、新しいスレッドを作成し、スレッドで関数を実行する関数の非常に単純なラッパーです。必要に応じて、これをスレッドの代わりにプロセスを使用するように簡単に適応させることができます。

main.py:

import time
from async import async

@async
def long_function(name, seconds_to_wait):
    print "%s started..." % name
    time.sleep(seconds_to_wait)
    print "%s ended after %d seconds" % (name, seconds_to_wait)

if __name__ == '__main__':
    long_function("first", 3)
    long_function("second", 4)
    long_function("third", 5)

関数を で装飾するだけで、@async非同期で呼び出すことができます。

あなたの場合: ループを関数内にラップし、 で装飾するだけ@asyncです。

フル機能の非同期デコレーターについては、http ://wiki.python.org/moin/PythonDecoratorLibrary#Asynchronous_Call を参照してください。

于 2013-05-17T20:41:24.257 に答える