0

私はプログラミングに比較的慣れていないので、私が求めているのは不可能なタスクかもしれません。私がやりたいことは、ユーザーが停止を要求するまで継続的に実行される並列プロセスを開始することです。プロセスが開始したら、プロセスを停止せずに親プログラムから並列プロセス内のローカル変数の 1 つを更新したいと考えています。非常に単純な例として、実行したい並列プロセスは次のようになります。

import time

def loop(i):
    while 1:
        print i
        i+=1
        time.sleep(1)

継続的に反復し、更新しますi。わかりやすくするために、親プログラムには以下が含まれます。

from multiprocessing import Process
from loop import loop

i = 1
p = Process(target = loop, args = (i))
p.start()

親プログラムから、「ループ」が開始されると、入力「i」を別の数値に変更し、次の開始値を指定してループを繰り返し続けられるようにしたいと考えています。誰かがこれを行う方法について何かアイデアを持っているなら、それは大歓迎です。

4

3 に答える 3

3

キューを使用して、プロセス間でデータを渡すことができます。

from multiprocessing import Process, Queue
from loop import loop

i = 1
q = Queue()
q.put(i)
p = Process(target=loop, args=(q, ))
p.start()

i の新しい値を他のプロセスに送信したいときはいつでも、それをキューに入れるだけです。

それに応じて loop.py モジュールを変更します。

def loop(q):
  while True:
    i = q.get()
    print i

メイン コードでは、プロセスに新しい値を設定できます。

while True:
  i+=1
  q.put(i)
  time.sleep(1)
于 2013-10-07T19:50:52.530 に答える
2

ここではキューに問題はありませんが、代わりに「共有メモリ」を使用する方がおそらく慣用的です。オーバーヘッドが少ない。自己完結型プログラムの例を次に示します。

import time

def loop(i):
    while 1:
        print i.value
        i.value += 1
        time.sleep(1)

if __name__ == "__main__":
    from multiprocessing import Process, Value

    i = Value("i", 1)  # "i" for integer, initial value 1
    p = Process(target=loop, args=(i,))
    p.start()
    for base in range(100, 600, 100):
        time.sleep(2)
        i.value = base

それはおそらく;-)表示:

1
2
100
101
200
201
300
301
400
401
500
501
502
503
504
505
506
...

ただし、注意してください。高速である代わりに、これは脆弱でもあります。この方法で共有できるデータの種類は、基本的に C 言語から継承されており、一般に Python のデータ型ほど豊富ではありません。上記の例では、型コードは符号"i"付き C を共有していることを意味します。intこれは通常、32 ビットの符号付き整数です。たとえば、i.valueが 2147483647 に達し、それに 1 を加えると、突然 -2147483648 (はい、マイナス!) になります。Python の int は無制限ですが、C の int はそうではありません。

于 2013-10-07T20:48:04.423 に答える