Saya menggunakan python(2.7.6),gevnet(1.1.2),requests(2.11.1) untuk membuat permintaan http bersamaan, dan itu berfungsi dengan baik. Tetapi ketika saya menambahkan proxy kaus kaki ke permintaan, itu memblokir.
Ini kode saya:
import time
import requests
import logging
import click
import gevent
from gevent import monkey
monkey.patch_all()
FORMAT = '%(asctime)-15s %(message)s'
logging.basicConfig(format=FORMAT)
logger = logging.getLogger('test')
#socks proxy
user = MY_SOCKS_PROXY_USERNAME
password = MY_SOCKS_PROXY_PASSWORD
host = MY_SOCKS_PROXY_HOST
port = MY_SOCKS_PROXY_PORT
proxies = {
'http': 'socks5://{0}:{1}@{2}:{3}'.format(user, password, host, port),
'https': 'socks5://{0}:{1}@{2}:{3}'.format(user, password, host, port),
}
url = 'https://www.youtube.com/user/NBA'
def fetch_url(i,with_proxy):
while True:
logger.warning('thread %s fetch url'%i)
try:
if with_proxy:
res = requests.get(url,proxies=proxies, timeout=5)
else:
res = requests.get(url, timeout=5)
except Exception as e:
logger.error(str(e))
continue
logger.warning(res.status_code)
def do_other_thing():
while True:
logger.warning('do other thing...')
time.sleep(1)
@click.command()
@click.option('--with_proxy/--without_proxy',help='if use proxy', default=True)
def run(with_proxy):
if with_proxy:
logger.warning('with proxy......')
else:
logger.warning('without proxy......')
ts = []
ts.append(gevent.spawn(do_other_thing))
for i in xrange(3):
ts.append(gevent.spawn(fetch_url,i,with_proxy))
gevent.joinall(ts)
if __name__=='__main__':
run()
Gambar-gambar ini menunjukkan hasilnya.
jalankan dengan proxy
berjalan tanpa proxy
Dengan proxy, do_other_thing akan memblokir sebelum fetch_url selesai.
Tanpa proxy, ini berfungsi dengan baik. (terjadi kesalahan batas waktu, karena GFW)
Adakah yang bisa membantu saya memecahkan masalah ini? Terima kasih banyak!
Tebakan terbaik saya adalah Anda terlambat melakukan monkeypatching. Saat menggunakan gevent, Anda harus monkeypatch terlebih dahulu , sebelum mengimpor yang lain. Melakukannya nanti berisiko merusak apa pun yang telah melakukan impor from
dari hal-hal yang gevent monkeypatches.
Bisakah Anda mencoba memindahkan impor dan monkeypatch Anda ke bagian paling atas file Anda sebelum melakukan hal lain?
Ya, ' memindahkan impor dan monkeypatch Anda ke bagian paling atas file Anda ' memecahkan masalah saya! Terima kasih banyak!
Saran ini juga memecahkan masalah proyek saya.
Saya memiliki 3 file bernama A,B,C, dan menjalankan urutannya adalah A->B->C. Saya menggunakan gevent di B, jadi saya menambahkan monkeypatch di B, tetapi saya memblokir dengan permintaan+kaus kaki. Sekarang saya menambahkan monkeypatch di bagian paling atas A, ini berfungsi dengan baik sekarang! Semoga ini bisa membantu orang lain!
Terima kasih lagi!
Saya senang bisa membantu!
Komentar yang paling membantu
Tebakan terbaik saya adalah Anda terlambat melakukan monkeypatching. Saat menggunakan gevent, Anda harus monkeypatch terlebih dahulu , sebelum mengimpor yang lain. Melakukannya nanti berisiko merusak apa pun yang telah melakukan impor
from
dari hal-hal yang gevent monkeypatches.Bisakah Anda mencoba memindahkan impor dan monkeypatch Anda ke bagian paling atas file Anda sebelum melakukan hal lain?