2009-03-13 13 views
13

Bazen takılan bir fonksiyon var. Normalde bir alarm kurardım ama Windows'dayım ve kullanılamıyor. Bunun etrafında basit bir yol var mı, yoksa sadece time.sleep() diye adlandırılan bir iş parçacığı mı oluşturmalıyım? Bir iş parçacığı ile gidip gelme sona erdi. Sadece hile os._exit yerinesignal.alarm ikamesi [Python]

import os 
import time 
import threading 

class Alarm (threading.Thread): 
    def __init__ (self, timeout): 
     threading.Thread.__init__ (self) 
     self.timeout = timeout 
     self.setDaemon (True) 
    def run (self): 
     time.sleep (self.timeout) 
     os._exit (1) 

alarm = Alarm (4) 
alarm.start() 
time.sleep (2) 
del alarm 
print 'yup' 

alarm = Alarm (4) 
alarm.start() 
time.sleep (8) 
del alarm 
print 'nope' # we don't make it this far 
+2

ait os._exit kullanıyordu? – ThiefMaster

+1

[threading.Timer() 'işlevini kullanabilirsiniz] (http://stackoverflow.com/a/28081214/4279) – jfs

+1

@ThiefMaster tamamlandı! – LondonRob

cevap

2

Yapabilirsin sys.exit ait kullanıyordum - bahsettiğin gibi - sadece saniye bu sayının uyuyarak yeni bir iş parçacığı başlaması.

Yoksa (Python, o windll.winmm olurdu) Windows' multimedya zamanlayıcılar birini kullanabilirsiniz. timeSetEvent'un aradığınız şey olduğuna inanıyorum. Bu arada, here'u kullanan bir kod parçası buldum.

3

En sağlam çözüm bir alt işlem kullanmak ve sonra bu alt işlemi sonlandırmaktır. Python2.6, alt işlemlere .kill() değerini ekler.Popen().

İş parçacığı yaklaşımınızın beklediğiniz gibi çalıştığını sanmıyorum. Referansınızı Thread nesnesine silmek, iş parçacığını öldürmez. Bunun yerine, iş parçacığının uyandığında denetlediği bir öznitelik ayarlamanız gerekir.

bir iplikle gidiş sona erdi:

+0

Belirli bir süre sonra asılı işlevini ele almak için '.kill()' i nasıl kullanacağınızı açıklayabilir misiniz? –

+0

Rhamphoryncus: Bence iş parçacığı referans çalışmasını silmenin ya da yapmamanın nedeninin bu davada biraz tartışılmasıdır. "Threading.Thread" alt sınıfının "run()" yönteminin sonuncusu, os._exit() işlevini çağırmasıdır ve eğer olmasa bile, yöntem sonlanır ve etkili bir şekilde "öldürülür". Daha da kötüsü, 'del alarmı' gereksizdir. – martineau

3

İşte orijinal afiş kendi problemi nasıl çözdüğünü bu. Sadece hile Eğer * Lütfen * soruya cevabını kaldırmak ve bir ... fiili * cevap * olarak yayınlamayın misiniz yerine sys.exit

import os 
import time 
import threading 

class Alarm (threading.Thread): 
    def __init__ (self, timeout): 
     threading.Thread.__init__ (self) 
     self.timeout = timeout 
     self.setDaemon (True) 
    def run (self): 
     time.sleep (self.timeout) 
     os._exit (1) 

alarm = Alarm (4) 
alarm.start() 
time.sleep (2) 
del alarm 
print 'yup' 

alarm = Alarm (4) 
alarm.start() 
time.sleep (8) 
del alarm 
print 'nope' # we don't make it this far