1

gevent を使用して非同期で作業を行うライブラリを作成しています。メインモジュールの実行が終わっても作業が完了することを保証したい。

class separate_library(object):
    def __init__(self):
        import gevent.monkey; gevent.monkey.patch_all()

    def do_work(self):
        from gevent import spawn
        spawn(self._do)

    def _do(self):
        from gevent import sleep
        sleep(1)
        print 'Done!'

if __name__ == '__main__':    
    lib = separate_library()
    lib.do_work()

これを実行すると、プログラムがすぐに終了し、Done!印刷されないことがわかります。

separate_library現在、メイン モジュールは実際に作業をどのように達成するか (またはそれが使用されているか) を認識していないか、気にしていないgeventため、そこに参加する必要があるのは不合理です。

separate_library特定のタイプのプログラムの終了を検出し、作業が完了するまで停止する方法はありますか? キーボード割り込み、SIGINT は、sys.exit()おそらく予期される動作であるため、すぐにプログラムを終了する必要があります。

ありがとう!

4

1 に答える 1

0

gevent スレッドを生成するデーモン スレッドではない新しいスレッドを使用してみてください。この非デーモン スレッドのため、プログラムは終了しません。

import gevent
import threading

class separate_library(object):
    def __init__(self):
        import gevent.monkey; gevent.monkey.patch_all()

    def do_work(self):
        t = threading.Thread(target=self.spawn_gthreads)
        t.setDaemon(False)
        t.start()


    def spawn_gthreads(self):
        from gevent import spawn
        gthreads = [spawn(self._do,x) for x in range(10)]
        gevent.joinall(gthreads)

    def _do(self,sec):
        from gevent import sleep
        sleep(sec)
        print 'Done!'

if __name__ == '__main__':    
    lib = separate_library()
    lib.do_work()
于 2013-12-03T14:29:23.267 に答える