2015-12-29 2 views
1

У меня есть ситуация, когда вы вызываете несколько запросов в задании планировщика, чтобы проверить статус живого пользователя на 1000 пользователей за раз. Но сервер ограничивает максимум до 50 пользователей в каждом попадании запроса API. Таким образом, используя следующий подход: for цикл занимает около 66 секунд для 1000 пользователей (т. Е. Для 20 вызовов API).Python Несколько запросов

from apscheduler.schedulers.blocking import BlockingScheduler 
sched = BlockingScheduler() 

def shcdulerjob(): 
    """ 
    """ 
    uidlist = todays_userslist() #Get around 1000 users from table 
    #-- DIVIDE LIST BY GIVEN SIZE (here 50) 
    split_list = lambda lst, sz: [lst[i:i+sz] for i in range(0, len(lst), sz)] 
    idlists = split_list(uidlist, 50) # SERVER MAX LIMIT - 50 ids/request 
    for idlist in idlists: 
     apiurl = some_server_url + "&ids="+str(idlist) 
     resp = requests.get(apiurl) 
     save_status(resp.json()) #-- Save status to db 
if __name__ == "__main__": 
    sched.add_job(shcdulerjob, 'interval', minutes=10) 
    sched.start() 

Так,

  • Есть ли обходной путь, так что она должна оптимизировать время, необходимое для извлечения API?
  • Есть ли Python- APScheduler какой-либо вариант многопроцессорности для обработки таких запросов api в одном задании?

ответ

1

Вы можете попытаться применить пул потоков python из модуля concurrent.futures, если сервер разрешает одновременные запросы. Таким образом, вы бы parallelise обработки, вместо самого планирования

Есть некоторые хорошие примеры, приведенные в документации here (Если вы используете Python 2, есть свой род equivalent module

например

import concurrent.futures 
import multiprocessing 
import requests 
import time 
import json 

cpu_start_time = time.process_time() 
clock_start_time = time.time() 

queue = multiprocessing.Queue() 
uri = "http://localhost:5000/data.json" 
users = [str(user) for user in range(1, 50)] 

with concurrent.futures.ThreadPoolExecutor(multiprocessing.cpu_count()) as executor: 
    for user_id, result in zip(
      [str(user) for user in range(1, 50)] 
      , executor.map(lambda x: requests.get(uri, params={id: x}).content, users) 
    ): 
     queue.put((user_id, result)) 

while not queue.empty(): 

    user_id, rs = queue.get() 
    print("User ", user_id, json.loads(rs.decode())) 

cpu_end_time = time.process_time() 
clock_end_time = time.time() 

print("Took {0:.03}s [{1:.03}s]".format(cpu_end_time-cpu_start_time, clock_end_time-clock_start_time)) 

Если вы хотите использовать пул процессов, просто убедитесь, что вы не использовать общие ресурсы, например, очереди и запись данных нашего независимо

+0

Позвольте мне попробовать это. Спасибо – Laxmikant

Смежные вопросы