2014-05-15 23 views
5

ile piton süreçlerin bir grubuna katılın.Birkaç süreçleri oluşturmak için Python en çoklu işlem kütüphanesi kullanıyorum zaman aşımı

from multiprocessing import Process 
processes = [Process(target=function) for function in FUNCTIONS] 
for p in processes: 
    p.start() 

Onları bazı süresince çalıştırmak istiyorum ve onlar tamamlamamış o zaman, onları sonlandırmak.

DURATION = 3600 

şöyle öyle yapmanın en kötü yolu (süreçler SÜRESİ daha hızlı bitirmek çünkü eğer kötü, hala SÜRESİ tüm bekler):

from time import sleep 
sleep(duration) 
for p in processes: 
    p.join(0) 
    p.terminate() 

Başka bir kötü şekilde yapmak (kötü muhtemelen bitirmek için N * SÜRESİNİ, N süreçlerin sayısı) alabilir çünkü:

for p in processes: 
    p.join(DURATION) 
    p.terminate() 

bunu yapmak için iyi bir yolu nedir?

+1

İşlemlerinizin ne yaptığını bilmiyorum, ancak normalde bitirme zamanı işlemine sinyal vermek için bir sinyal değişkenini kullanırsınız. Yani DURATION yoluna gideceksin, var olanı ayarla ve katılmayı bekle. – RedX

cevap

2

Bu, herhangi bir sorgulama gerektirmeden istediğinizi yaptığınıza inanıyorum ve yalnızca belirtilen DURATION değerini bekleyecektir. yapmak

time_waited = 0 
then = time.time() 
for p in processes: 
    if time_waited >= DURATION: 
     p.join(0) 
     p.terminate() 
    p.join(DURATION - time_waited) 
    time_waited = time.time() - then 
+0

Neden "o zaman" güncellersiniz? Son iki satır yerine "time_waited = şimdi - sonra" olabilir. – Zags

+0

Hmm evet bu da işe yarar. Sanırım bir nedenden ötürü sahip olduğum gibi, önce doğal olarak bana gelen şeydi. Belki de senin yolun biraz daha açık. Onu değiştireceğim. – wubwubb

0

Bu, tüm işlemlerin tamamlanıp tamamlanmadığı, yani DURATION değerine kadar her saniye sorgulanır. Tüm süreçler bittiğinde veya DURATION gerçekleşmişse, tüm süreçleri birleştirir/öldürür. Mükemmel değil, çünkü bu, döngü için her iterasyonda bir saniyeden biraz daha uzun sürecek, ancak oldukça yakın olacak.

from time import sleep 
for _ in range(DURATION): 
    if not any(i.is_alive() for i in processes): break 
    sleep(1) 
for p in processes: 
    p.join(0) 
    p.terminate() 
0

kolay şey join(0) hepsi süreçler ve daha sonra çıkar bir "ana" parçacığı vardır ve ana iş parçacığı join(3600) ana iş parçacığı olması muhtemelen.

def wait_func(): 
    for p in processes: 
    p.join() 

wait_process = Process(target=wait_func) 
wait_process.start() 
wait_process.join(DURATION) 
for p in processes: 
    p.terminate()