1

Моя проблема в том, что всякий раз, когда я использую thr.results(), программа действует как ее работа на одном потоке. Но когда я не использую thr.results(), он будет использовать x threads , поэтому, если я удалю оператор if if, он будет работать на 10 потоках, если у меня он там, он будет действовать как один на один поток 1Python mulithreading concurrent.futures

def search(query): 
    r = requests.get("https://www.google.com/search?q=" + query) 
    return r.status_code 

pool = ThreadPoolExecutor(max_workers=10) 
for i in range(50): 
    thr = pool.submit(search, "stocks") 
    print(i) 
    if thr.result() != 404: 
     print("Ran") 

pool.shutdown(wait=True) 

ответ

0

Это потому, что result будет ждать будущего, чтобы закончить:

возвратить значение, возвращенное вызовом. Если вызов еще не завершен, этот метод будет ждать до таймаута секунд. Если вызов не завершился с тайм-аутом секунд, то будет увеличен параметр concurrent.futures.TimeoutError. timeout может быть int или float. Если тайм-аут не указан или None, ограничение времени ожидания не ограничено.

Когда вы result внутри цикла вы передаете задачу, а затем ждать его завершения, а затем представить еще один, так что может быть только одна задача, которая выполняется одновременно.

Обновление Вы можете сохранить возвращенные фьючерсы в список и перебрать их после отправки всей задачи. Другой вариант заключается в использовании map:

from concurrent.futures import ThreadPoolExecutor 
import time 

def square(x): 
    time.sleep(0.3) 
    return x * x 

print(time.time()) 
with ThreadPoolExecutor(max_workers=3) as pool: 
    for res in pool.map(square, range(10)): 
     print(res) 

print(time.time()) 

Выход:

1485845609.983702 
0 
1 
4 
9 
16 
25 
36 
49 
64 
81 
1485845611.1942203 
+0

Хмм я вижу сейчас, что вы бы предложить, чтобы иметь программу делать то, что я хочу? –

+0

@ LopezNlak Добавлен пример использования 'map'. – niemmi

+0

Спасибо, сделаю Threading + Queue или вы думаете, что использование параллельного модуля в порядке? –