0

問題が発生しました。このようになります。関数は通常、単一の結果を返します。私が望むのは、特定の時間枠(オプション)の結果の連続ストリームを返すことです。

関数が 1 回の関数呼び出しに対して繰り返し結果を返すことは可能ですか?

ネットを閲覧しているときに、gevent と threading に出くわしました。もしそうなら、それを解決する方法はありますか?

関数を呼び出して作業を実行し、すべてのタスクが完了した直後に結果を返すだけです。

4

2 に答える 2

2

これが必要な理由は質問で指定されていないため、何が必要かを知るのは難しいですが、一般的な考え方とコードも示します。

あなたはそのように戻ることができます:(return var1, var2, var3しかし、それはあなたが必要としているものではないと思います)

複数のオプションがあります: ブロックまたは非ブロックのいずれかです。ブロッキングとは、関数の呼び出し中にコードが実行されなくなることを意味します。ノンブロッキングとは、並行して実行されることを意味します。また、その関数を呼び出すコードを変更する必要があることも知っておく必要があります。

それは、スレッドでそれが必要な場合です(ノンブロッキング):

def your_function(callback):
    # This is a function defined inside of it, just for convenience, it can be any function.
    def what_it_is_doing(callback):
        import time
        total = 0
        while True:
            time.sleep(1)
            total += 1
            # Here it is a callback function, but if you are using a
            # GUI application (not only) for example (wx, Qt, GTK, ...) they usually have
            # events/signals, you should be using this system.
            callback(time_spent=total)

    import thread
    thread.start_new_thread(what_it_is_doing, tuple(callback))

# The way you would use it:
def what_I_want_to_do_with_each_bit_of_result(time_spent):
    print "Time is:", time_spent

your_function(what_I_want_to_do_with_each_bit_of_result)
# Continue your code normally

もう 1 つのオプション (ブロッキング) には、generators技術的にイテレータとして扱われる特別な種類の関数が含まれます。したがって、関数として定義し、反復子として機能します。これは、他の関数と同じダミー関数を使用した例です。

def my_generator():
    import time
    total = 0
    while True:
        time.sleep(1)
        total += 1
        yield total

# And here's how you use it:
# You need it to be in a loop !!
for time_spent in my_generator():
    print "Time spent is:", time_spent

# Or, you could use it that way, and call .next() manually:
my_gen = my_generator()
# When you need something from it:
time_spent = my_gen.next()

2 番目の例では、実際には 1 秒間隔で呼び出されるわけではないため、コードが意味をなさないことに注意yieldしてください。これは、何か.nextが呼び出されるたびに他のコードが実行され、時間がかかる可能性があるためです。しかし、あなたが要点を得たことを願っています。

繰り返しますが、使用しているアプリに「イベント」フレームワークなどがある場合は、それを使用する必要があります。ブロック/非ブロックが必要な場合は、時間が重要な場合はコードを呼び出す方法によって異なります。結果を操作する必要があります...

于 2012-05-25T07:11:21.183 に答える
0

関数は一度に 1 つの変数を受け入れるか、セットを取得してセットまたは変数のいずれかを返すようにプログラムされていることを実行するため、gevent とスレッド化は正しい軌道に乗っています。いずれかの結果を返すために関数を呼び出す必要があり、おそらく処理の連続ストリームがすでに行われているか、そうでない場合はカーネルポインターまたは同様のものを介したループについて尋ねているので、...

したがって、関数をカプセル化する呼び出しコードは重要です。関数、任意の関数、たとえば true/false ブール関数でさえ、その変数で完了するまでしか実行されないため、ケースでは無期限にリッスンする呼び出し関数が存在する可能性があります. 存在しない場合は、作成する必要があります;)

カプセル化するコードを呼び出すことは確かに非常に重要です。

人々は、あなたが何らかのフレームワークのイベントループ、または他のコードの何らかの形のループの中にいる、またはそこにいるべきであるとあなたに伝えることができるという非常に一般的な意味を除いて、多くを助けるのに十分な情報を持っていません。あなたはデータを聞いたり準備したりしたいです。

こういうのは「関数型プログラミング」の「マップ関数」が好きです。おもう。私の担当者レベルでコメントすることはできません。または、推測をそれに限定します。:)

他の人からより良い回答を得るには、サンプル コードを投稿し、可能であれば API を公開してください。

于 2012-05-25T06:12:57.683 に答える