Requests: gevent + meminta blok saat menggunakan kaus kaki

Dibuat pada 10 Feb 2017  ·  3Komentar  ·  Sumber: psf/requests

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!

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?

Semua 3 komentar

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!

Apakah halaman ini membantu?
0 / 5 - 0 peringkat