2015-04-27 4 views
0

Я знаю, что для PreparedRequest, мы specifiy тайм-аут в session.send вызова, где session может быть экземпляром класса requests.Session, как я уже видел здесь: http://docs.python-requests.org/en/latest/user/advanced/Определение тайм-аута для питона-запросов, при использовании PreparedRequest

Но мне нужно поставить таймаут, прежде чем я отправлю. В некоторой степени, для объекта PreparedRequest. Потому что я использую метод session.send как функцию карты, чтобы сопоставить экземпляры PreparedRequest.

def async_req2resp(reqs, session): 
    responses = [] 
    try: 
     with futures.ThreadPoolExecutor(max_workers=workers) as executor: 
      for response in executor.map(session.send, requests): 
       responses.append(response) 
    except Exception as e: 
     print('async_requests2responses exception: ' + str(e)) 
    return responses 

Теперь мне нужно указать время ожидания как-то. Как мне это сделать? Вышеприведенный код завернут внутри метода. Я получаю объект session в качестве аргумента. Есть ли способ установить тайм-аут для всех запросов, которые будут отправлены с объектом session, до того, как произойдет параллельное выполнение session.send?

спасибо.

+0

Что такое "sendit"? Принимает ли он произвольные аргументы ключевого слова для функции/метода, который он вызывает? –

ответ

0

Я жду вашего ответа о sendit, но до тех пор позвольте мне предоставить вам некоторую информацию, которая поможет вам получить остальную часть пути туда.

Если у вас есть объект PreparedRequest как request то вы можете сделать session.send(request, timeout=timeout_val) где timeout_val является то, что значение тайм-аута является то, что вы хотите.

Имея это в виду, этот вопрос становится следующим: «Как передать это sendit с каждым запросом?» и на этот вопрос у меня нет ответа.

Примечание стороны:

Вы помечены это с concurrent.futures, который заставляет меня подозревать, что вы пытаетесь оптимизировать приложение, которое использует этот метод. Имея это в виду, вы должны избегать добавления в список любой ценой. Вы должны, вместо этого, попробуйте сделать следующее:

responses = [] 
try: 
    responses = list(sendit.map(session.send, requests)) 
# etc. 

Если вы выяснить, как передать параметр времени ожидания в sendit, не стесняйтесь предложить правку к этому ответу, чтобы обновить его, чтобы быть полным.


С обновленной информацией в вопросе, я могу более точно ответить на ваш вопрос.

Перед тем, как позвонить executor.map вы должны сделать следующее:

import functools 

timedout_send = functools.partial(session.send, timeout=my_timeout) 

try: 
    list(executor.map(timedout_send, requests)) 
# ... 
+0

Привет! Спасибо за ответ. Я обновил свой фрагмент кода. Дело в том, что я пытаюсь распараллелить запросы, сделанные из моего кода. И обновленный код - это более простая версия того, как я это делаю. –

+0

@bad_keypoints Я обновил это с помощью лучшего способа сделать то, что вы хотите. Cheers –

+0

Спасибо. Я попробую, когда у меня будет время вернуться к этой части кода, и тогда я сделаю галочку. :) –