3

私はしばらくの間問題に苦しんでいます。メインループを使用する小さなスクリプトを作成しています。これは、ユーザーの注意が必要なプロセスです。ユーザーはステップに応答し、いくつかの機能を使用するといくつかの魔法が起こります

これに加えて、特定のキーを押すなどの特定のイベントについてコンピューターシステムを監視する別のプロセスを生成したいと考えています。これらのイベントが発生すると、ユーザーが正しい値を指定した場合と同じ機能が起動されます。

そのため、次の 2 つのプロセスを作成する必要があります。 - メイン ループ (ユーザーの操作を可能にする) - 特定のイベントを検索して反応するバックグラウンドの "イベント スキャナー"。

メイン ループとデーモン マルチプロセッシング プロセスを起動して、これを試します。問題は、バックグラウンド プロセスを起動すると起動するが、その後メイン ループを起動しないことです。より明確にするために、すべてを少し単純化しました。

import multiprocessing, sys, time

def main_loop():
    while 1:
        input = input('What kind of food do you like?')
        print(input)

def test():
    while 1:
        time.sleep(1)
        print('this should run in the background')

if __name__ == '__main__':
    try:
        print('hello!')
        mProcess = multiprocessing.Process(target=test())
        mProcess.daemon = True
        mProcess.start()
        #after starting main loop does not start while it prints out the test loop fine.
        main_loop() 
    except:
        sys.exit(0)
4

2 に答える 2

6

やったほうがいい

mProcess = multiprocessing.Process(target=test)

それ以外の

mProcess = multiprocessing.Process(target=test())

あなたのコードは実際にtest親プロセスを呼び出し、その呼び出しは決して返されません。

于 2013-03-15T10:58:51.100 に答える
-2

ロック同期を使用して、プログラムのフローをより適切に制御できます。不思議なことに、入力関数は EOF エラーを発生させますが、回避策を見つけることができると確信しています。

import multiprocessing, sys, time

def main_loop(l):
    time.sleep(4)
    l.acquire()

    # raise an EOFError, I don't know why .
    #_input = input('What kind of food do you like?') 

    print(" raw input at 4 sec ")
    l.release()

    return

def test(l):
    i=0
    while i<8:
        time.sleep(1)

        l.acquire()
        print('this should run in the background : ', i+1,  'sec')
        l.release()

        i+=1

    return



if __name__ == '__main__':

    lock = multiprocessing.Lock()


    #try:
    print('hello!')
    mProcess = multiprocessing.Process(target=test, args = (lock, ) ).start()

    inputProcess = multiprocessing.Process(target=main_loop, args = (lock,)).start()



    #except:
        #sys.exit(0)
于 2013-03-15T11:00:17.357 に答える