2017-07-07 13 views
0

私のテスト機能の1つに非同期作業を実装したいと思います。 機能、ヒューリスティックは、次のようになります -Greenlet値を使って作業する

def test_sessions(self): 
    sessions = [] 
    """ 
    Creating 10k session instances 
    """ 
    for i in xrange(10000): 
     sessions.append(Session.create_session(session_handle, login_params(user, pass)) 
    """ 
    Foreach session instance, check session validity by running read_dir command 
    """ 
    for session in sessions: 
     connection = Connection.create_connection(addrs, port) 
     connection.session = session.id 
     response = connection.read_dir(dir) 
    """ 
    Deleting the 10k opened sessions 
    """ 
    for session in sessions: 
     session.delete(session_handle) 

10Kセッションのために、このチェックを実行するのにかかる時間は30メートル程度です。したがって、私は、これらのセクション(作成、チェック、削除)にgreenletとgeventを使用して、物事を少し速くすることにします。

グリーンレットスレッドによって作成されるセッションインスタンスにアクセスする方法を特定できないため、このアイデアを実装する方法を理解する上で問題があります。どのようにするべきかの良い例は見つかりませんでしたグリーンレットの値を使用することができます。

def check_session() 
    session = Session.create_session(session_handle, login_params(user, pass) 
    connection = Connection.create_connection(addrs, port) 
    connection.session = session.id 
    response = connection.read_dir(dir) 
    session.delete(session_handle) 

今、あなたはインポートする必要greenlet、monkey-:

、単一の関数に単一のセッションのためのコードを入れて、ここで

答えて

0

このようなものを使用してgreenletの正しい道に私を指示してください。 [範囲でiについて(10000)Greenlet.spawn(check_session)]タスクにタスクの をタスク=使用してタスクを作成し、すべてのパッチ、および: task.run()

すべてのT尋ねが開始されます。グリーンレットは並行して実行されないことに注意してください - ネットワークソケットのような入力/出力のみをブロックするので、別のものが実行を開始します。ほとんどの時間がネットワークを待つのに費やされている場合は、時間をすごす必要があります。そうでない場合、そうではありません。

また、ネットワークにアクセスするための非常に固有のコードやカスタムコードを使用している場合は注意が必要です。 monkey.patch_all()は、Pythonのソケットコード(およびディスクのi/oなど)を待機する代わりに別のグリーンレットに変換するgeventバージョンに置き換えます。コードにsocketが使用されていない場合は、パッチが適用されていない可能性があります。