1

私はpython 2.7マルチプロセッシングモジュールを使用しています。プロセスを開始してから終了し、新しい引数で再度開始したいです。

p = Process(target=realwork, args=(up, down, middle, num))
def fun1():
    p.start()

def fun2():
    p.terminate()

そして、プログラム フローの過程で (ループとイベントを介して)、次の順序で関数を呼び出します。

fun1()
fun2()
fun1()
fun2()

試してみると、同じプロセスを複数回呼び出すことはできないというエラーが表示されます。回避策はありますか?

4

2 に答える 2

2

つまり、ypuはおそらくどこかで「グローバル変数を使用するのは良い習慣ではない」と読んでいたでしょう。これが理由です。「p」変数は「Process」インスタンスを1つだけ保持し、開始(および終了)できるのは1回だけです。

「fun1」と「fun2」がパラメーターとして機能するプロセスを実行するように、またはおそらくオブジェクト指向の方法で、fun1とfun2がメソッドであり、プロセスがインスタンス変数であるようにコードをリファクタリングする場合、これらの問題のいずれかがあります。

この場合、OOはすぐに確認でき、簡単に使用できます。

class MyClass(object):
    def __init__(self):
        self.p = Process(target=realwork,args=(up,down,middle,num))
    def fun1(self):
        self.p.start()

    def fun2(self):
        self.p.terminate()

そして、「fun1」と「fun2」のペアの呼び出しが必要な場合は、次のようにします。

action = Myclass()
action.fun1()
action.fun2() 

代わりは。これは、forループなどの内部でも機能します。

*編集-Tkinterプログラムでボタンを押したときの答えとしてこれを使用しているのを見たばかりなので、ボタンのクリックの間のどこかにProcessインスタンスを記録する必要があります。リファクタリングするコードがなくても、グローバル変数アプローチを継続するつもりであれば、「fun1」内にProcessインスタンスを作成するだけで済みます。これは機能します。

def fun1():
    global p
    p = Process(target=realwork,args=(up,down,middle,num))
    p.start()

def fun2():
    p.terminate()
于 2012-10-11T03:54:52.857 に答える
1

あなたterminateがプロセスをしたら、それは死んでいます。たとえば、パイプを使用してプロセスと通信できるようにプロセスを再構築できる場合があります。子プロセスが適切に機能していない場合、それを正しく行うのは難しいかもしれません。Processそれ以外の場合は、引数のセットごとにの新しいインスタンスを作成できます。

于 2012-10-11T01:14:23.127 に答える