पायथन में दोहराना कार्यों को संभालना

हाय दोस्तों मैं पाइथन के लिए नया हूं और मुझे अपने परिदृश्य में कोई दृष्टिकोण नहीं मिल रहा है। मैं अलग-अलग पैरामीटर के साथ एक ही फ़ंक्शन के एकाधिक दोहराव वाले कार्यों को कैसे शुरू कर सकता हूं, और अभी भी किसी निश्चित को रोकने की क्षमता है?

चीजों को स्पष्ट करने के लिए छवि को झुकाएं। मेरे पास एक एफ (एक्स) फ़ंक्शन है। मैं अलग-अलग प्रविष्टि डेटा के साथ कई स्वतंत्र पुनरावर्ती कॉल शुरू करना चाहता हूं और बाद में उन्हें अलग-अलग रोक सकता हूं।

विवरण http://happyfacedevs.com/public/python.png

UPDATE: Here's the whole scenario. I have a main function that gets called every 60 secs. This function gets a list of urls and based on some conditions it decides to start the repeating function with the given url or stops an already running one.

def f(x):
    #repeat every 5 secs until stopped
    #do stuff with x


def mainTask():
    #gets a new list of urls

    #for every url, start a new repeating task or stop an existing one
    #based on some conditions

    threading.Timer(60, mainTask).start()


mainTask()
0
क्या आप "एकाधिक दोहराव वाले कार्यों को स्पष्ट कर सकते हैं?" क्या आपका मतलब है कि आप f (a) , f (b) , f (c) को एक बार कॉल करना चाहते हैं और उन्हें बार-बार चलाएं रद्द होने तक, या आप बस इसका मतलब यह है कि आप f (a) , f (b) , f (c) पर कॉल करना चाहते हैं और हो बाद में किसी में से किसी एक को रोकने में सक्षम?
जोड़ा लेखक sberry, स्रोत
@sberry प्रत्येक एफ (एक्स) को एक बार कॉल करें और फिर उन्हें रोक दिए जाने तक खुद को याद रखें। समय पर एक निश्चित बिंदु पर चल रहे कई (या यहां तक ​​कि कोई नहीं) कार्य हो सकते हैं। 3 लोग केवल एक उदाहरण थे।
जोड़ा लेखक sheitan, स्रोत
चीजों को समानांतर में चलाने के लिए आप मल्टीप्रोसेसिंग या मल्टीथ्रेडिंग का उपयोग कर सकते हैं। पुनरावर्तित कार्यों के लिए आपको उन्हें रद्द करने में सक्षम होने के लिए लूप (जैसे थोड़ी देर लूप) की आवश्यकता होती है, आपको मुख्य पर चलने वाला लूप चाहिए जो उपयोगकर्ता स्टॉप कमांड की जांच करेगा, जो बाहर निकलने के लिए फ़ंक्शंस पर चल रहे लूप को सूचित करेगा। ये 3 अलग-अलग प्रश्न हैं। कृपया प्रत्येक के लिए एक नया प्रश्न पूछें, जो आपने कोशिश की है उसे परिभाषित करें, और आपके लक्ष्य क्या हैं, उतनी ही जानकारी/डेटा जितना आप कर सकते हैं।
जोड़ा लेखक Inbar Rose, स्रोत

3 उत्तर

you can use gevent.spawn() to implement your independent tasks. a snippet from http://www.gevent.org/intro.html#example

>>>import gevent
>>>from gevent import socket
>>>urls = ['www.google.com', 'www.example.com', 'www.python.org']
>>>jobs = [gevent.spawn(socket.gethostbyname, url) for url in urls]
>>>gevent.joinall(jobs, timeout=2)
>>>[job.value for job in jobs]
['74.125.79.106', '208.77.188.166', '82.94.164.162']
2
जोड़ा

यह किसी भी विशिष्ट उदाहरण दिखाए बिना एक बहुत ही व्यापक प्रश्न है और आप जो चाहते हैं उसे हासिल करने के कई तरीके हैं। हालांकि, यह पीईपी 3156 और tulip

0
जोड़ा

यदि ए, बी, सी निरंतर स्थिर रहता है:

import time
import threading

def f(param, stop_event):
    while not stop_event.is_set():
         # do something with param


events = {'a': threading.Event(), 
          'b': threading.Event(), 
          'c': threading.Event(), 
}
for param, ev in zip([a, b, c], events):
    t = Thread(target=f, args=(param, ev))
    t.start()
time.sleep(10)
events['a'].set() # stop a
time.sleep(10)
events['b'].set() # stop b
time.sleep(10)
events['c'].set() # stop c

यदि a, b, c पुनरावृत्ति में नया है तो आप Queue का उपयोग कर सकते हैं:

import time
import threading

def f(q, stop_event):
    while not stop_event.is_set():
         param = q.get()
         # do something with param

q = threading.Queue()
events = {'a': threading.Event(), 
          'b': threading.Event(), 
          'c': threading.Event(), 
}
for ev in events:
    t = Thread(target=f, args=(q, ev))
    t.start()
q.put(a)
q.put(b)
q.put(c)
time.sleep(10)
events['a'].set() # stop a
time.sleep(10)
events['b'].set() # stop b
time.sleep(10)
events['c'].set() # stop c

यह कुछ नमूना समाधान है।

0
जोड़ा