1

私は、実行しているかもしれないし、していないかもしれない別のサーバーへの照会を要求するサーバーを持っています。そのサーバーが実行されていない場合、私は長い間ブロックしたくありません。私はすぐにエラーを処理することができます。ただし、timeoutパラメータは、最初の接続を確立するプロセスには適用されないようです。端末からPythonリクエストで初期接続をブロックしない方法は?

は、私が実行します。

>>> import time 
>>> import requests 
>>> t1 = time.time() ; exec("try: requests.get('http://192.168.99.100/', timeout=1.0)\nexcept: pass") ; t2 = time.time() ; t2 - t1 
21.00611114501953 

これは、約21秒かかり、私が与えるタイムアウトには依存性がありません。私はまた、eventletのタイムアウトを使用してみましたが、それは同じ判明:

>>> import time 
>>> import eventlet 
>>> requests = eventlet.import_patched('requests') 
>>> t1 = time.time() ; exec("try: \n with eventlet.Timeout(1): requests.get('http://192.168.99.100/')\nexcept: pass") ; t2 = time.time() ; t2 - t1 
21.00276017189026 

私は接続のために取得していますエラーは次のとおりです。最後

ConnectionError: ('Connection aborted.', error(11, 'Resource temporarily unavailable')) 

、私はLinux用のWindowsサブシステムの下でのpythonを実行していますこれは、ソケットで別々に動作している可能性があります。ドキュメントから

+3

OS Xで動作します。おそらくWindows関連の問題です。この問題を回避するには、スレッドを使用することができます。つまり、スレッド内の要求呼び出しがタイムアウト内に応答しなかった場合は、メインスレッドで続行します。 –

+2

@ J.P.Petersen WSLはまだ動作しているので、これはおそらく手元にある問題だと思います。 – Akh

答えて

0

タイムアウトが全体のレスポンスのダウンロードに時間制限はありません。むしろ、 サーバが タイムアウト秒(より正確には、タイムアウト秒の間に 下位ソケットで受信されたバイトがない場合)の応答を発行していない場合、例外が発生します。

ポーリングのようなものを使用した例です。

import gevent, time 
import requests 

from gevent import monkey, spawn, sleep 
monkey.patch_all() # for working with requests/sockets 


do_not_wait = [] 
print(time.time()) 

do_not_wait.append(gevent.spawn(requests.get, 'http://192.168.99.100/', timeout=1.0)) 
do_not_wait.append(gevent.spawn(requests.get, 'http://192.168.99.100/', timeout=1.0)) 
do_not_wait.append(gevent.spawn(requests.get, 'http://192.168.99.100/', timeout=1.0)) 

[x.start() for x in do_not_wait] 
print(time.time()) 

while True: 
    sleep(1) 
    print([x.ready() for x in do_not_wait]) 
0

あなたは、ワーカースレッドでタイムアウトを設定(のようなcelery)タスクマネージャを使用することができます。私はrequestsがを使って同じ問題を見ているのかもしれないので、geventではなくeventletをサポートしていると思います。

関連する問題