2

現在、私は3つのプロセスA、B、Cがメインプロセスで作成されています。しかし、プロセスAでBとCを開始したいと思いますか?AssertionError:現在のプロセスによって作成されたプロセスオブジェクトのみを開始できます

process.py

from multiprocessing import Process 

procs = {} 
import time 

def test(): 
    print(procs) 
    procs['B'].start() 
    procs['C'].start() 
    time.sleep(8) 

    procs['B'].terminate() 
    procs['C'].termiante() 

    procs['B'].join() 
    procs['C'].join() 




def B(): 
    while True: 
     print('+'*10) 
     time.sleep(1) 
def C(): 
    while True: 
     print('-'*10) 
     time.sleep(1) 


procs['A'] = Process(target = test) 
procs['B'] = Process(target = B) 
procs['C'] = Process(target = C) 

main.py

from process import * 
print(procs) 
procs['A'].start() 
procs['A'].join() 

そして私は持っエラー てAssertionError:のみ

は、任意の別の方法はあります現在のプロセスによって作成されたプロセスオブジェクトを開始することができますAのプロセスBとCを開始するには?または、Aがマスタプロセスの開始をBとCに問い合わせるように信号を送信させます

+0

'multiprocessing'モジュールをチェックして、何かを試してみて、あなたのコードを見せてください。 –

+0

@AliGajani私はAでこれらのプロセスを作成しようとしましたが、これは私の状況に合っていません。 –

答えて

2

Eventオブジェクトを使用して同期を行うことをお勧めします。プロセス間でいくつかのアクションをトリガーすることができます。たとえば、

from multiprocessing import Process, Event 
import time 

procs = {} 


def test(): 
    print(procs) 

    # Will let the main process know that it needs 
    # to start the subprocesses 
    procs['B'][1].set() 
    procs['C'][1].set() 
    time.sleep(3) 

    # This will trigger the shutdown of the subprocess 
    # This is cleaner than using terminate as it allows 
    # you to clean up the processes if needed. 
    procs['B'][1].set() 
    procs['C'][1].set() 


def B(): 
    # Event will be set once again when this process 
    # needs to finish 
    event = procs["B"][1] 
    event.clear() 
    while not event.is_set(): 
     print('+' * 10) 
     time.sleep(1) 


def C(): 
    # Event will be set once again when this process 
    # needs to finish 
    event = procs["C"][1] 
    event.clear() 
    while not event.is_set(): 
     print('-' * 10) 
     time.sleep(1) 


if __name__ == '__main__': 
    procs['A'] = (Process(target=test), None) 
    procs['B'] = (Process(target=B), Event()) 
    procs['C'] = (Process(target=C), Event()) 
    procs['A'][0].start() 

    # Wait for events to be set before starting the subprocess 
    procs['B'][1].wait() 
    procs['B'][0].start() 
    procs['C'][1].wait() 
    procs['C'][0].start() 

    # Join all the subprocess in the process that created them. 
    procs['A'][0].join() 
    procs['B'][0].join() 
    procs['C'][0].join() 

このコードは実際にはクリーンではありません。この場合、必要なイベントは1つだけです。しかし、あなたは主な考えを得るべきです。

さらに、プロセスAは不要です。代わりにコールバックを使用することを検討できます。いくつかの非同期アクションを連鎖させる場合は、例えばconcurrent.futuresモジュールを参照してください。

関連する問題