أستخدم python (2.7.6) و gevnet (1.1.2) والطلبات (2.11.1) لجعل طلبات http متزامنة ، وهي تعمل بشكل جيد. ولكن عندما أقوم بإضافة وكيل الجوارب إلى الطلبات ، فإنه يتم حظره.
هذا هو الكود الخاص بي:
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()
تظهر هذه الصور النتيجة.
تشغيل بالوكالة
تشغيل بدون وكيل
باستخدام الوكيل ، سيتم حظر do_other_thing قبل إتمام fetch_url.
بدون وكيل , يعمل بشكل جيد. (حدث خطأ انتهاء المهلة بسبب GFW)
هل يمكن لأي شخص أن يساعدني في حل هذه المشكلة؟ شكرا جزيلا!
أفضل تخميني هو أنك تصطاد القرود بعد فوات الأوان. عند استخدام gevent ، يجب عليك monkeypatch أولاً ، قبل استيراد أي شيء آخر. يؤدي القيام بذلك لاحقًا إلى خطر كسر أي شيء أدى إلى استيراد from
من الأشياء التي منعت monkeypatches.
هل يمكنك محاولة نقل الاستيراد و monkeypatch إلى أعلى ملفك قبل القيام بأي شيء آخر؟
نعم ، لقد أدى نقل الاستيراد و monkeypatch إلى أعلى ملفك إلى حل مشكلتي! شكرا جزيلا!
هذا الاقتراح يحل أيضًا مشكلة مشروعي.
لدي 3 ملفات تسمى A ، B ، C ، وتسلسل التشغيل هو A-> B-> C. أستخدم gevent في B ، لذلك أضفت monkeypatch في B ، لكنني أحجب الطلبات + الجوارب. الآن أضفت monkeypatch في الجزء العلوي من A ، إنها تعمل بشكل رائع الآن! أتمنى أن يساعد هذا الآخرين!
شكرا مرة اخرى!
سررت بالمساعدة!
التعليق الأكثر فائدة
أفضل تخميني هو أنك تصطاد القرود بعد فوات الأوان. عند استخدام gevent ، يجب عليك monkeypatch أولاً ، قبل استيراد أي شيء آخر. يؤدي القيام بذلك لاحقًا إلى خطر كسر أي شيء أدى إلى استيراد
from
من الأشياء التي منعت monkeypatches.هل يمكنك محاولة نقل الاستيراد و monkeypatch إلى أعلى ملفك قبل القيام بأي شيء آخر؟