Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Python Multiprocessing - Possible to start the workers at slightly different starting time?

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))

the output is:

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

The 3 workers start at the same time.

I really want to know that is it possible to start the 3 workers at (slightly) different time?

Much thanks in advance!

PS. As in the comment, any slightly different time would be fine (would be better if I can control). However, I do not want the workers to sleep before every job they do. I just want the 3 workers to start at different times but afterwards never sleep between jobs. So, I am not sure that putting time.sleep in worker function works.

like image 805
shucqgz Avatar asked Feb 05 '26 16:02

shucqgz


1 Answers

Pools can run an initializer in the child process. Use that to wait.

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))

You can control sleep time by creating a queue with the times. Each initializer reads one value

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()
like image 101
tdelaney Avatar answered Feb 07 '26 04:02

tdelaney



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!