Requests: طلب gevent + الكتل عند استخدام الجوارب

تم إنشاؤها على ١٠ فبراير ٢٠١٧  ·  3تعليقات  ·  مصدر: psf/requests

أستخدم 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 إلى أعلى ملفك قبل القيام بأي شيء آخر؟

ال 3 كومينتر

أفضل تخميني هو أنك تصطاد القرود بعد فوات الأوان. عند استخدام gevent ، يجب عليك monkeypatch أولاً ، قبل استيراد أي شيء آخر. يؤدي القيام بذلك لاحقًا إلى خطر كسر أي شيء أدى إلى استيراد from من الأشياء التي منعت monkeypatches.

هل يمكنك محاولة نقل الاستيراد و monkeypatch إلى أعلى ملفك قبل القيام بأي شيء آخر؟

نعم ، لقد أدى نقل الاستيراد و monkeypatch إلى أعلى ملفك إلى حل مشكلتي! شكرا جزيلا!

هذا الاقتراح يحل أيضًا مشكلة مشروعي.
لدي 3 ملفات تسمى A ، B ، C ، وتسلسل التشغيل هو A-> B-> C. أستخدم gevent في B ، لذلك أضفت monkeypatch في B ، لكنني أحجب الطلبات + الجوارب. الآن أضفت monkeypatch في الجزء العلوي من A ، إنها تعمل بشكل رائع الآن! أتمنى أن يساعد هذا الآخرين!

شكرا مرة اخرى!

سررت بالمساعدة!

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات

القضايا ذات الصلة

jakul picture jakul  ·  3تعليقات

avinassh picture avinassh  ·  4تعليقات

ReimarBauer picture ReimarBauer  ·  4تعليقات

justlurking picture justlurking  ·  3تعليقات

mitar picture mitar  ·  4تعليقات