4

zerorpcPython 2.7のモジュールを介して呼び出すと、バックグラウンドでいくつかの計算を行う小さなプログラムがあります。

これが私のコードです:

is_busy = False

class Server(object):
   def calculateSomeStuff(self):
       global is_busy

        if (is_busy):
            return 'I am busy!'

        is_busy = True

        # calculate some stuff

        is_busy = False
        print 'Done!'
        return 

    def getIsBusy(self):
        return is_busy

s = zerorpc.Server(Server())
s.bind("tcp://0.0.0.0:66666")
s.run()

メソッドis_busyを呼び出したときにこのプログラムが返されるようにするには、何を変更すればよいですか?.getIsBusy().calculateSomeStuff()

私が知っているように、python 2 で非同期にする方法はありません。

4

1 に答える 1

3

真の同時実行性のためにはマルチスレッドが必要であり、これが目的の場合は複数の CPU コアを利用します。Python スレッド モジュール、GIL-lock の詳細と考えられる回避策、文献を参照してください。

協力的な解決策が必要な場合は、読み進めてください。

zerorpcgevent非同期入出力に使用します。geventすべて単一のスレッドで協調して実行されるコルーチン (greenlet またはユーザーランド スレッドとも呼ばれます) を記述します。gevent入出力ループが実行されているスレッド。はgevent ioloop、何らかの I/O イベントを待っているコルーチンを再開します。

ここで重要なのは、「協力的」という言葉です。これを、単一の CPU/コア マシンで実行されているスレッドと比較してください。事実上、同時実行はありません
が、オペレーティング システムは(動詞: (予想されるイベント) の発生を防ぐためにアクションを実行する)実行中のスレッドを先取りして次のスレッドを実行するなど、すべてのスレッドが移動する公平な機会を得られるようにします。前方。

これは、すべてのスレッドが同時に実行されているように感じるほど高速に発生します。

gevent入出力ループと連携してコードを作成する場合は、他のコルーチンを実行gevent.sleep(0)する機会を与えるのに十分な頻度で呼び出すように注意することで、同じ効果を得ることができます。gevent ioloop

文字通り協調的なマルチスレッドです。Windows 2か何かでそうだったと聞いたことがあります。

したがって、あなたの例では、重い計算部分で、ループが発生している可能性があります。gevent.sleep(0)毎秒数回呼び出すようにしてください。マルチスレッドのような錯覚が生じます。

私の答えがあまり混乱していないことを願っています。

于 2016-03-18T08:57:05.457 に答える