उपयोग कर रहा हूँ आप एक थ्रेड पूल निश्चित-आकार का उपयोग करते हुए नौकरियों का एक समूह को चलाना चाहते हैं, तो आप इस तरह concurrent.futures.ThreadPoolExecutor
उपयोग कर सकते हैं,:
from concurrent.futures import ThreadPoolExecutor
with ThreadPoolExecutor(max_workers=5) as executor:
for work in work_list:
executor.submit(work_function, work)
आप यह सुनिश्चित करना चाहते हैं कि आप एक से अधिक एपीआई कॉल करते हैं, तो आपको इसे अपने work_function
के अंदर से करने की ज़रूरत है। नौकरी जमा करते समय आप ऐसा नहीं कर सकते हैं, क्योंकि आप नहीं जानते कि नौकरी कब तक पहुंचने के लिए इंतजार कर रही है।
तो यह मेरे थे, मैं इतना है कि यह पुन: प्रयोज्य है अपने ही वर्ग में कोड सीमित दर डाल चाहते हैं:
from collections import Iterator
from threading import Lock
import time
class RateLimiter(Iterator):
"""Iterator that yields a value at most once every 'interval' seconds."""
def __init__(self, interval):
self.lock = Lock()
self.interval = interval
self.next_yield = 0
def __next__(self):
with self.lock:
t = time.monotonic()
if t < self.next_yield:
time.sleep(self.next_yield - t)
t = time.monotonic()
self.next_yield = t + self.interval
api_rate_limiter = RateLimiter(1)
def work_function(work):
next(api_rate_limiter)
call_api(...)
time.monotonic
अजगर 3.3 में पेश किया गया था; अजगर के पुराने संस्करणों में आप time.time
इस्तेमाल कर सकते हैं लेकिन यह पीछे की ओर जब सिस्टम घड़ी परिवर्तन है, तो आप यह सुनिश्चित करें कि इस लंबा सोता का कारण नहीं है की आवश्यकता होगी कूद कर सकते हैं:
time.sleep(min(self.next_yield - t, self.interval))
स्रोत
2013-12-17 21:02:58
मैं सही है कि आप एक बना सकते हैं मिला प्रति सेकंड अनुरोध, इसलिए जब आप पहली क्वेरी परिणाम के लिए 20 सेकंड प्रतीक्षा करते हैं, तो आप 1 9 को तुरंत चालू कर सकते हैं? क्या उन अतिरिक्त 1 9 प्रश्नों में पहले व्यक्ति के लिए प्रतिक्रिया धीमी नहीं होगी? – alko
नौकरियों को कतारबद्ध करने और दर सीमा निर्धारित करने के लिए सेलरी का उपयोग क्यों नहीं करें? – adam
@adam यह इस काम के लिए थोड़ा अधिक नहीं है? – alko