2017-04-19 14 views
3
import multiprocessing as mp 
from datetime import datetime 

def worker(a): 
    print(str(a)+": "+str(datetime.now())) 
    time.sleep(1) 


pool=mp.Pool(3) 
if __name__ == '__main__': 
    pool.map(worker,range(10)) 

出力は次のようになります。Pythonマルチプロセッシング - わずかに異なる開始時刻にワーカーを起動することは可能ですか?

0: 2017-04-18 23:37:31.399574 
1: 2017-04-18 23:37:31.400422 
2: 2017-04-18 23:37:31.400571 
3: 2017-04-18 23:37:32.401644 
4: 2017-04-18 23:37:32.401765 
5: 2017-04-18 23:37:32.401904 
6: 2017-04-18 23:37:33.403168 
7: 2017-04-18 23:37:33.403250 
8: 2017-04-18 23:37:33.403370 
9: 2017-04-18 23:37:34.405025 

3人の労働者が同時に開始します。

私は実際には(わずかに)で3人の労働者を開始することが可能であることを知りたいと思っています時間?

事前に感謝します!

PS。コメントのように、わずかに異なる時間があればいいでしょう(私が制御できれば良いでしょう)。しかし、私は仕事をする前に労働者が眠ることを望んでいません。私は、3人の労働者が別々の時間に始めることを望みますが、その後は仕事の間に寝ることはありません。だから、私は働いている機能のtime.sleepを入れていることが分かりません。

+1

何時に発生するのですか?あるいはわずかに異なる時間ですか? printステートメントの前に "time.sleep(random.random())"のようなものを "ワーカー"関数に入れることができます –

+0

ありがとう!ちょっと違う時は大丈夫でしょう。しかし、私は仕事をする前に労働者が眠ることを望んでいません。私は、3人の労働者が別々の時間に始めることを望みますが、その後は仕事の間に寝ることはありません。 – shucqgz

+0

'Pool'の' initializer'パラメータを使います。プロセスが開始されたときに呼び出される関数で、そこに眠ることができます。 – tdelaney

答えて

2

プールは、子プロセスで初期化子を実行できます。それを使って待ってください。

import multiprocessing as mp 
from datetime import datetime 
import time 
import random 
import os 

def sleepy(): 
    nap = random.randint(1,10) 
    print(os.getpid(), 'sleeps', nap) 
    time.sleep(nap) 

def worker(a): 
    print(os.getpid(), str(a)+": "+str(datetime.now())) 
    time.sleep(1) 

pool=mp.Pool(3, initializer=sleepy) 
if __name__ == '__main__': 
    pool.map(worker,range(10)) 

時刻を含むキューを作成することでスリープ時間を制御できます。各イニシャライザは1つの値を読み取ります

import multiprocessing as mp 
from datetime import datetime 
import time 
import random 
import os 
import threading 

def sleepy(time_q): 
    timeout = time_q.get() 
    print(os.getpid(), 'sleeps', timeout, datetime.now()) 
    time.sleep(timeout) 

def worker(a): 
    print(os.getpid(), 'worker', str(a)+": "+str(datetime.now())) 
    time.sleep(1) 

if __name__ == '__main__': 
    pool_size = 3 
    time_q = mp.Queue() 
    for sleep_time in range(1, pool_size+1): 
     time_q.put(sleep_time) 
    pool=mp.Pool(pool_size, initializer=sleepy, initargs=(time_q,)) 
    pool.map(worker,range(10)) 
    time_q.close() 
    time_q.join() 
+0

これは素晴らしいことです!どうもありがとう! – shucqgz

+0

睡眠時間をコントロールするための提案はありますか?最初の仕事を2秒、2秒4秒、3秒6秒間寝たいとします。 – shucqgz

+0

はい、...私は今、その質問で遊んでいます。数分後に... – tdelaney

関連する問題