親プロセスから、子プロセスで実行されているメインループに対してGMainLoop.quit()を呼び出す

リズムチョプラ

ビデオストリーミングを実行するには、gstreamerパイプラインを実行する必要があります。GStreamerパイプラインには、が呼び出されるまで終了しないメソッドGObject.MainLoopを持つオブジェクトが必要です。このために、メインスレッドでGObject.MainLoopインスタンスを実行するメインアプリケーションプロセス()からプロセス(を作成します。問題は、ループがプロセスP2内で無期限に進行し、メインアプリケーションプロセス(P1)からループを終了/終了できないことです。run()quit()P2P1

以下は、シナリオの理解に役立つ可能性のあるコードのセクションです。

'''
start() spawns a new process P2 that runs Mainloop within its main thread.
stop() is called from P1, but does not quit the Mainloop. This is probably because 
processes do not have shared memory
'''
from multiprocessing import Process
import gi

from gi.repository import GObject

class Main:
    def __init__(self):
        self.process = None
        self.loop = GObject.MainLoop()

    def worker(self):
        self.loop.run()

    def start(self):
        self.process=Process(target=self.worker, args=())
        self.process.start()

    def stop(self):
        self.loop.quit()

次に、プロセス間で「ループ」変数を共有するためにマルチプロセッシングキューを使用しようとしましたが、それでもメインループを終了できません。

'''
start() spawns a new process and puts the loop object in a multiprocessing Queue
stop() calls get() from the loop and calls the quit() method, though it still does not quit the mainloop.
'''
from multiprocessing import Process, Queue
import gi

from gi.repository import GObject

class Main:
    def __init__(self):
        self.p=None
        self.loop = GObject.MainLoop()
        self.queue = Queue()

    def worker(self):
        self.queue.put(self.loop)
        self.loop.run()


    def start(self):
        self.p=Process(target=self.worker, args=())
        self.p.start()

    def stop(self):
        # receive loop instance shared by Child Process
        loop=self.queue.get()
        loop.quit()

子プロセスP2内でのみアクセス可能なMainLoopオブジェクトのquitメソッドを呼び出すにはどうすればよいですか?

リズムチョプラ

multiprocessing.Processクラスのモジュールを拡張し、Mainそのrun()メソッドをオーバーライドしてGObject.MainloopインスタンスT1をそのではなく別のスレッド(内で実際に実行しましたmain threadそしてようになります待機通知メカニズム実装main threadプロセス(のがP2)の下で行くためにwait-notifyループと使用multiprocessing.Queueのメインスレッドにメッセージを転送するP2P2同時に通知されますが。たとえば、オーバーライドされたメソッドでハンドラーが定義されてstop()いるquitメッセージを送信するメソッド。このモジュールを拡張して、ハンドラーも定義する必要がある場合は、任意の数のメッセージを解析できますP2run()Child Process

以下は、私が使用したコードスニペットです。

from multiprocessing import Process, Condition, Queue
from threading import Thread
import gi

from gi.repository import GObject

loop=GObject.MainLoop()

def worker():
    loop.run()

class Main(Process):

    def __init__(self, target=None, args=()):
        self.target=target
        self.args=tuple(args)
        print self.args
        self.message_queue = Queue()
        self.cond = Condition()
        self.thread = None
        self.loop = GObject.MainLoop()
        Process.__init__(self)

    def run(self):
        if self.target:
            self.thread = Thread(target=self.target, args=())
            print "running target method"
            self.thread.start()

        while True:
            with self.cond:
                self.cond.wait()
            msg = self.message_queue.get()
            if msg == 'quit':
                print loop.is_running()
                loop.quit()
                print loop.is_running()
                break
            else:
                print 'message received', msg

    def send_message(self, msg):
        self.message_queue.put(msg)
        with self.cond:
            self.cond.notify_all()

    def stop(self):
        self.send_message("quit")
        self.join()

    def func1(self):
        self.send_message("msg 1") # handler is defined in the overridden run method

    # few others functions which will send unique messages to the process, and their handlers 
    # are defined in the overridden run method above

この方法は私のシーンリオではうまく機能していますが、同じことを行うためのより良い方法があれば提案を歓迎します。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

PythonのUbuntuローカルホストで実行されているプロセスを呼び出す

分類Dev

子プロセスを使用して、親ディレクトリから.classファイルを実行するにはどうすればよいですか?

分類Dev

Pythonマルチプロセッシング-親で実行されているGUIに子プロセスログを送信する

分類Dev

親プロセスでsleep()を使用しても、子プロセスは最後に実行されます

分類Dev

Linux:PID、ユーザー、グループ、コマンドライン、および親/子階層を使用して実行中のプロセスのリストを表示するにはどうすればよいですか?

分類Dev

親プロセスから実行中のプロセスでメソッドを呼び出す

分類Dev

セレン:どのようにdriver.quitを呼び出さずに、PCのメモリに影響を与えるgeckodriverプロセスを停止しますか()?

分類Dev

独立して実行され、メインプロセスが閉じられても実行を継続するサブプロセスをPythonで開始するにはどうすればよいですか?

分類Dev

Cを使用して親プロセスから子プロセスにシグナルを送信するにはどうすればよいですか?

分類Dev

メインプロセスからKeyboardInterruptを使用して子プロセスを停止するにはどうすればよいですか?

分類Dev

メインプロセスからKeyboardInterruptを使用して子プロセスを停止するにはどうすればよいですか?

分類Dev

c#コードによって呼び出されているSQLで実行されているプロセスを把握する

分類Dev

Windows cmd .bat-親に対して同時に実行され、親が実行すると閉じる子プロセスを開始します

分類Dev

子プロセスがまだ実行されている限り、親プロセスで90秒ごとにperlにメッセージを記録します

分類Dev

ブラウザからローカルホストで実行されているSignalRアプリケーションにアクセスします

分類Dev

コマンドプロンプトからさまざまなパラメータを取得するバックグラウンドプロセスとしてPythonスクリプトを実行するにはどうすればよいですか?

分類Dev

ローカルマシンで実行されているノードアプリからGoogleCloudDatastoreにアクセスします

分類Dev

親プロセスとして子プロセスを実行する

分類Dev

Linuxシステムコールは、子プロセスと親プロセスにintを渡すFork()を使用して問題を呼び出します

分類Dev

子プロセスは、作成される前からコードを実行しているようです。どうすれば止められますか?

分類Dev

Azure Webロールから、プロセスがワーカーロールで実行されているかどうかを確認します

分類Dev

親プロセスがまだ実行されている場合、子プロセスのPIDは再利用可能になりますか?

分類Dev

親の終了後に閉じる子としてShellExecuteExを使用してプロセスを実行するにはどうすればよいですか?

分類Dev

fastify、jest:fastifyインスタンスで.close()を呼び出した後にプロセスを実行する

分類Dev

スクリプトからdockercontainer内で実行されているプロセスを強制終了します

分類Dev

子プロセスがctrl- \を介して中止されたときに、親プロセスが実行されていません

分類Dev

Linuxサービスとして実行されているPythonスクリプトからPopenを呼び出すと、プロセスを開始できません。

分類Dev

マルチプロセッシングによって呼び出された関数がメッセージを出力しないのはなぜですか?

分類Dev

プロセスが実行されていないときに、プロセスによって使用され、他の実行中のプロセスと共有されていない一部のページをメインメモリに残すことはできますか?

Related 関連記事

  1. 1

    PythonのUbuntuローカルホストで実行されているプロセスを呼び出す

  2. 2

    子プロセスを使用して、親ディレクトリから.classファイルを実行するにはどうすればよいですか?

  3. 3

    Pythonマルチプロセッシング-親で実行されているGUIに子プロセスログを送信する

  4. 4

    親プロセスでsleep()を使用しても、子プロセスは最後に実行されます

  5. 5

    Linux:PID、ユーザー、グループ、コマンドライン、および親/子階層を使用して実行中のプロセスのリストを表示するにはどうすればよいですか?

  6. 6

    親プロセスから実行中のプロセスでメソッドを呼び出す

  7. 7

    セレン:どのようにdriver.quitを呼び出さずに、PCのメモリに影響を与えるgeckodriverプロセスを停止しますか()?

  8. 8

    独立して実行され、メインプロセスが閉じられても実行を継続するサブプロセスをPythonで開始するにはどうすればよいですか?

  9. 9

    Cを使用して親プロセスから子プロセスにシグナルを送信するにはどうすればよいですか?

  10. 10

    メインプロセスからKeyboardInterruptを使用して子プロセスを停止するにはどうすればよいですか?

  11. 11

    メインプロセスからKeyboardInterruptを使用して子プロセスを停止するにはどうすればよいですか?

  12. 12

    c#コードによって呼び出されているSQLで実行されているプロセスを把握する

  13. 13

    Windows cmd .bat-親に対して同時に実行され、親が実行すると閉じる子プロセスを開始します

  14. 14

    子プロセスがまだ実行されている限り、親プロセスで90秒ごとにperlにメッセージを記録します

  15. 15

    ブラウザからローカルホストで実行されているSignalRアプリケーションにアクセスします

  16. 16

    コマンドプロンプトからさまざまなパラメータを取得するバックグラウンドプロセスとしてPythonスクリプトを実行するにはどうすればよいですか?

  17. 17

    ローカルマシンで実行されているノードアプリからGoogleCloudDatastoreにアクセスします

  18. 18

    親プロセスとして子プロセスを実行する

  19. 19

    Linuxシステムコールは、子プロセスと親プロセスにintを渡すFork()を使用して問題を呼び出します

  20. 20

    子プロセスは、作成される前からコードを実行しているようです。どうすれば止められますか?

  21. 21

    Azure Webロールから、プロセスがワーカーロールで実行されているかどうかを確認します

  22. 22

    親プロセスがまだ実行されている場合、子プロセスのPIDは再利用可能になりますか?

  23. 23

    親の終了後に閉じる子としてShellExecuteExを使用してプロセスを実行するにはどうすればよいですか?

  24. 24

    fastify、jest:fastifyインスタンスで.close()を呼び出した後にプロセスを実行する

  25. 25

    スクリプトからdockercontainer内で実行されているプロセスを強制終了します

  26. 26

    子プロセスがctrl- \を介して中止されたときに、親プロセスが実行されていません

  27. 27

    Linuxサービスとして実行されているPythonスクリプトからPopenを呼び出すと、プロセスを開始できません。

  28. 28

    マルチプロセッシングによって呼び出された関数がメッセージを出力しないのはなぜですか?

  29. 29

    プロセスが実行されていないときに、プロセスによって使用され、他の実行中のプロセスと共有されていない一部のページをメインメモリに残すことはできますか?

ホットタグ

アーカイブ