2015-04-21 20 views
5

मैं पृष्ठभूमि में काम करने वाले दिल की धड़कन कॉल को लागू करने की कोशिश कर रहा हूं।पायथन में अंतराल फ़ंक्शन कॉल पर थ्रेडेड पृष्ठभूमि कैसे बनाएं?

self.mqConn.heartbeat_tick() 

इसके अलावा, मैं इस सूत्र कैसे बंद कर देंगे: मैं एक हर 30 सेकंड का कहना है के अंतराल फोन पर पिरोया जो निम्नलिखित फ़ंक्शन को कॉल कैसे बना सकता हूँ?

बहुत धन्यवाद।

उत्तर

6

आप टाइमर उपवर्ग सकता है, आसान रद्द करने के लिए

from threading import Thread 
import time 

def background_task(): 
    while not background_task.cancelled: 
     self.mqConn.heartbeat_tick() 
     time.sleep(30) 
background_task.cancelled = False 

t = Thread(target=background_task) 
t.start() 

background_task.cancelled = True 

वैकल्पिक रूप से एक पाश युक्त एक धागा का उपयोग करें:

from threading import Timer 

class RepeatingTimer(Timer): 
    def run(self): 
     while not self.finished.is_set(): 
      self.function(*self.args, **self.kwargs) 
      self.finished.wait(self.interval) 


t = RepeatingTimer(30.0, self.mqConn.heartbeat_tick) 
t.start() # every 30 seconds, call heartbeat_tick 

# later 
t.cancel() # cancels execution 
+1

यह उल्लेख करने के लिए है कि इस * * हर 30 सेकंड पर अमल नहीं होगा यदि 'heartbeat_tick()' एक महत्वपूर्ण राशि समय की – goncalopp

+0

हाँ लेता महत्वपूर्ण हो सकता है, इस वसीयत हर बार कम से कम 30 सेकंड हो। अधिकतम 30 सेकंड में थोड़ा कठिन होता है। – Eric

+1

यदि आपका अग्रभूमि फ़ंक्शन सीपीयू बाध्य था, तो पृष्ठभूमि थ्रेड को कभी भी जीआईएल द्वारा निष्पादित करने से रोका जाएगा? –

2

एक तरह से यह करने के लिए इस तरह circuits आवेदन ढांचे का उपयोग करने के लिए होगा:

from circuits import Component, Event, Timer 


class App(Component): 

    def init(self, mqConn): 
     self.mqConn = mqConn 
     Timer(30, Event.create("heartbeat"), persist=True).register(self) 

    def heartbeat(self): 
     self.mqConn.heartbeat_tick() 


App().run() 

नोट: मैं सर्किट :)

के लेखक हूँ यह सिर्फ एक मूल विचार है और संरचना - आपको अपने सटीक आवेदन और आवश्यकताओं के अनुरूप इसे अनुकूलित करने की आवश्यकता होगी!

1

या आप सूत्रण मॉड्यूल में टाइमर वर्ग इस्तेमाल कर सकते हैं :

from threading import Timer 

def hello(): 
    print "hello, world" 

t = Timer(30.0, hello) 
t.start() # after 30 seconds, "hello, world" will be printed 
t.cancel() # cancels execution, this only works before the 30 seconds is elapsed 

यह हर एक्स सेकंड शुरू नहीं करेगा, बल्कि यह x सेकंड में निष्पादन के लिए थ्रेड को देरी करता है। लेकिन आप इसे अभी भी एक लूप में डाल सकते हैं और इसकी स्थिति देखने के लिए t.is_alive() का उपयोग कर सकते हैं।

+0

लूप कहाँ जाना होगा? – Eric

+0

यह उपयोग के मामले पर निर्भर करेगा? – Joe

+0

क्या उसे पृष्ठभूमि धागे में भी नहीं होना चाहिए? – Eric

2

Eric के जवाब देने के लिए एक त्वरित फॉलोअप: यदि आप Timer उपवर्ग नहीं कर सकते हैं यह वास्तव में है, क्योंकि सच वर्ग इर्द-गिर्द एक समारोह आवरण: _Timer। यदि आप करते हैं तो आपको वह समस्या मिल जाएगी जो this post में पॉप अप हो जाती है।

_Timer का उपयोग बजाय इसे ठीक करता है:

from threading import _Timer 

class RepeatingTimer(_Timer): 
    def run(self): 
     while not self.finished.is_set(): 
      self.function(*self.args, **self.kwargs) 
      self.finished.wait(self.interval) 


t = RepeatingTimer(30.0, self.mqConn.heartbeat_tick) 
t.start() # every 30 seconds, call heartbeat_tick 

# later 
t.cancel() # cancels execution 
संबंधित मुद्दे