У меня проблема с моим кодом очистки веб-страниц. Вот суть этого:
У меня есть пул прокси, и я инициализирую объект сеанса для каждого прокси. После этого я передаю объект сеанса потоку, и этот поток затем очищает сайт (в данном случае, globenewswire.com). Моя проблема заключается в том, чтобы очистить один и тот же сайт несколькими сеансами одновременно. Когда у меня есть несколько объектов сеанса, которые работают в многопоточной среде, я получаю ошибки. Когда я запускаю свои сеансовые объекты по одному, я полностью в порядке.
import time
import requests
import threading
lock = threading.Lock()
proxy_pool = [] # List of 11 proxies with format: "0.0.0.0:0000"
session_pool = []
def print_lock(stuff):
with lock:
print(stuff)
def initialize_session(proxy):
global session_pool
proxiez = {"http": "http://" + proxy, "https": "http://" + proxy}
s = requests.Session()
s.mount('https://globenewswire.com', HTTPAdapter(pool_connections=1, pool_maxsize=11))
s.proxies = proxiez
while True:
try:
r = s.get('http://globenewswire.com/Search', headers={'headers': 'here'})
if r.status_code == 200:
break
else:
print_lock('r.status_code =', str(r.status_code), 'for proxy:', proxy)
except Exception as e:
print_lock('Error for proxy:', proxy + '. Error:', str(e))
time.sleep(1)
with lock:
session_pool.append(s)
print('Created Session now in session_pool with proxy: ' + proxy + '.')
startup_thread_list = []
for proxie in proxy_pool:
startup_thread = threading.Thread(target=initialize_session, args=(proxie,))
startup_thread_list.append(startup_thread)
startup_thread.daemon = True
startup_thread_list.append(startup_thread)
startup_thread.start()
for thread in startup_thread_list:
thread.join()
print('Set up all sessions.')
def remove_session():
global session_pool
while True:
with lock:
if len(session_pool) == 0:
session_waited = 'yes'
else:
session = session_pool[0]
session_pool.remove(session)
break
time.sleep(0.1)
return session
while True:
sesh = remove_session()
doStuffwithSessionthread = threading.Thread(target=doStuff, args=(sesh,))
doStuffwithSessionthread.daemon = True
doStuffwithSessionthread.start()
# Submit the session to only one thread
# the thread then returns that session to the session_pool as its final task.
time.sleep(4)
Интересно, что я пытался открыть отдельный интерпретатор Python для каждого прокси-сервера, который был у меня в пуле прокси, и передавал только один прокси в пул каждого интерпретатора. Я эффективно ограничил количество объектов сеанса одним интерпретатором. Я смог запустить 11 переводчиков бок о бок без каких-либо проблем. Однако, если я попытаюсь запустить 11 сеансов в одном интерпретаторе, я получу больше ошибок, чем код состояния 200. Это заставляет меня поверить, что у меня возникла проблема с модулем запросов или собственным кодом.
Requests рекомендует запускать только один объект сеанса на поток. Я точно знаю, что я запускаю не более одного потока для каждого имеющегося у меня объекта сеанса, но по некоторым причинам мои запросы https возвращаются как ошибки чаще, чем нет.
Этот код также отлично работает, если у вас есть только один объект сеанса, выполняющий запрос в любой момент времени в интерпретаторе, но выдает ошибки, как не завтра, как только несколько объектов сеанса делают запросы одновременно.
Это меня давно беспокоило, кто-нибудь знает, что может происходить? Пожалуйста, дайте мне знать, если мне нужно что-то прояснить.