悬挂线程等待网络请求。
悬挂线程等待网络请求。
我有24/7运行的脚本,有时候在concurrent.futures的线程中发出请求后会卡住没有响应。\n我使用concurrent.futures线程池同时向经纪人发送请求。所以,每个线程都是一个简单的函数,请求账户余额或发送订单。我需要这些线程被执行或失败,以便继续进行下一步操作,因为每一步操作都需要之前通过线程获取的数据。\n下面是两个简单订单函数和并发未来的示例。\n
def sell_orders_0(): order = client.new_order(symbol = ticker, side = 'SELL', type = 'LIMIT_MAKER', quantity = xquantity, price = xprice) def buy_orders_0(): order = client.new_order(symbol = ticker, side = 'SELL', type = 'LIMIT_MAKER', quantity = xquantity, price = xprice) with concurrent.futures.ThreadPoolExecutor() as executor: sells_0 = executor.submit(sell_orders_0) buys_0 = executor.submit(buy_orders_0)
\nThe hanging Threads module会打印出哪个线程卡住了以及原因:\n
线程 139646566659840 "ThreadPoolExecutor-666849_1" 卡住 - 文件 "/usr/lib/python3.9/threading.py",行 912,在 _bootstrap_inner() 中 self._bootstrap_inner() 文件 "/usr/lib/python3.9/threading.py",行 954,在 _bootstrap_inner() 中 self.run() 文件 "/usr/lib/python3.9/threading.py",行 892,在 run() 中 self._target(*self._args, **self._kwargs) 文件 "/usr/lib/python3.9/concurrent/futures/thread.py",行 77,在 _worker() 中 work_item.run() 文件 "/usr/lib/python3.9/concurrent/futures/thread.py",行 52,在 run() 中 result = self.fn(*self.args, **self.kwargs) 文件 "/home/user/binance_bot.py",行 1346,在 sell_orders_3() 中 order = client.new_order(symbol = ticker, side = 'SELL', type = 'LIMIT_MAKER', quantity = xquantity, price = xprice) 文件 "/home/user/.local/lib/python3.9/site-packages/binance/spot/trade.py",行 68,在 new_order() 中 return self.sign_request("POST", url_path, params) 文件 "/home/user/.local/lib/python3.9/site-packages/binance/api.py",行 83,在 sign_request() 中 return self.send_request(http_method, url_path, payload) 文件 "/home/user/.local/lib/python3.9/site-packages/binance/api.py",行 115,在 send_request() 中 response = self._dispatch_request(http_method)(**params) 文件 "/home/user/.local/lib/python3.9/site-packages/requests/sessions.py",行 635,在 post() 中 return self.request("POST", url, data=data, json=json, **kwargs) 文件 "/home/user/.local/lib/python3.9/site-packages/requests/sessions.py",行 587,在 request() 中 resp = self.send(prep, **send_kwargs) 文件 "/home/user/.local/lib/python3.9/site-packages/requests/sessions.py",行 701,在 send() 中 r = adapter.send(request, **kwargs) 文件 "/home/user/.local/lib/python3.9/site-packages/requests/adapters.py",行 489,在 send() 中 resp = conn.urlopen( 文件 "/home/user/.local/lib/python3.9/site-packages/urllib3/connectionpool.py",行 703,在 urlopen() 中 httplib_response = self._make_request( 文件 "/home/user/.local/lib/python3.9/site-packages/urllib3/connectionpool.py",行 444,在 _make_request() 中 httplib_response = conn.getresponse() 文件 "/usr/lib/python3.9/http/client.py",行 1347,在 getresponse() 中 response.begin() 文件 "/usr/lib/python3.9/http/client.py",行 307,在 begin() 中 version, status, reason = self._read_status() 文件 "/usr/lib/python3.9/http/client.py",行 268,在 _read_status() 中 line = str(self.fp.readline(_MAXLINE + 1), "iso-8859-1") File "/usr/lib/python3.9/socket.py",行 704,在 readinto() 中 [0/1893] return self._sock.recv_into(b) 文件 "/usr/lib/python3.9/ssl.py",行 1241,在 recv_into() 中 return self.read(nbytes, buffer) 文件 "/usr/lib/python3.9/ssl.py",行 1099,在 read() 中 return self._sslobj.read(len, buffer) 线程 139646533089024 "ThreadPoolExecutor-666849_0" 卡住 - 文件 "/usr/lib/python3.9/threading.py",行 912,在 _bootstrap_inner() 中 self._bootstrap_inner() 文件 "/usr/lib/python3.9/threading.py",行 954,在 _bootstrap_inner() 中 self.run() 文件 "/usr/lib/python3.9/threading.py",行 892,在 run() 中 self._target(*self._args, **self._kwargs) 文件 "/usr/lib/python3.9/concurrent/futures/thread.py",行 77,在 _worker() 中 work_item.run() 文件 "/usr/lib/python3.9/concurrent/futures/thread.py",行 52,在 run() 中 result = self.fn(*self.args, **self.kwargs) 文件 "/home/user/binance_bot.py",行 1298,在 sell_orders_0() 中 order = client.new_order(symbol = ticker, side = 'SELL', type = 'LIMIT_MAKER', quantity = xquantity, price = xprice) 文件 "/home/user/.local/lib/python3.9/site-packages/binance/spot/trade.py",行 68,在 new_order() 中 return self.sign_request("POST", url_path, params) 文件 "/home/user/.local/lib/python3.9/site-packages/binance/api.py",行 83,在 sign_request() 中 return self.send_request(http_method, url_path, payload) 文件 "/home/user/.local/lib/python3.9/site-packages/binance/api.py",行 115,在 send_request() 中 response = self._dispatch_request(http_method)(**params) 文件 "/home/user/.local/lib/python3.9/site-packages/requests/sessions.py",行 635,在 post() 中 return self.request("POST", url, data=data, json=json, **kwargs) 文件 "/home/user/.local/lib/python3.9/site-packages/requests/sessions.py",行 587,在 request() 中 resp = self.send(prep, **send_kwargs) 文件 "/home/user/.local/lib/python3.9/site-packages/requests/sessions.py",行 701,在 send() 中 r = adapter.send(request, **kwargs) 文件 "/home/user/.local/lib/python3.9/site-packages/requests/adapters.py",行 489,在 send() 中 resp = conn.urlopen( 文件 "/home/user/.local/lib/python3.9/site-packages/urllib3/connectionpool.py",行 703,在 urlopen() 中 httplib_response = self._make_request( 文件 "/home/user/.local/lib/python3.9/site-packages/urllib3/connectionpool.py",行 444,在 _make_request() 中 httplib_response = conn.getresponse() 文件 "/usr/lib/python3.9/http/client.py",行 1347,在 getresponse() 中 response.begin() 文件 "/usr/lib/python3.9/http/client.py",行 307,在 begin() 中 version, status, reason = self._read_status() 文件 "/usr/lib/python3.9/http/client.py",行 268,在 _read_status() 中 line = str(self.fp.readline(_MAXLINE + 1), "iso-8859-1") 文件 "/usr/lib/python3.9/socket.py",行 704,在 readinto() 中 return self._sock.recv_into(b) 文件 "/usr/lib/python3.9/ssl.py",行 1241,在 recv_into() 中 return self.read(nbytes, buffer) 文件 "/usr/lib/python3.9/ssl.py",行 1099,在 read() 中 return self._sslobj.read(len, buffer) ---------线程 139646838966080 "MainThread" 卡住 --------- 文件 "/home/user/binance_bot.py",行 1596,在() 中 buys_0 = executor.submit(buy_orders_0) 文件 "/usr/lib/python3.9/concurrent/futures/_base.py",行 628,在 __exit__() 中 self.shutdown(wait=True) 文件 "/usr/lib/python3.9/concurrent/futures/thread.py",行 229,在 shutdown() 中 t.join() 文件 "/usr/lib/python3.9/threading.py",行 1033,在 join() 中 self._wait_for_tstate_lock() 文件 "/usr/lib/python3.9/threading.py",行 1049,在 _wait_for_tstate_lock() 中 elif lock.acquire(block, timeout):
\n我该如何使我的代码非阻塞?\n我已经询问过如果我的代码卡住了如何引发异常,但是由于无法从外部取消正在运行的线程,所以这是不可能的。
文章标题:解决Hanging thread waiting for network request问题的方法
在解决Hanging thread waiting for network request问题之前,我们需要了解这个问题出现的原因。根据给出的信息,我们知道需要在binance/api.py
中的requests.post()
调用中添加一个timeout
参数。根据https://requests.readthedocs.io/en/latest/user/advanced/#timeouts的描述,我们可以得到以下信息:
大多数与外部服务器的请求都应该附带一个超时时间,以防服务器没有及时响应。默认情况下,如果没有显式设置超时时间,请求将不会超时。如果没有超时时间,你的代码可能会在几分钟或更长时间内挂起。
根据上述描述,我们可以得出解决Hanging thread waiting for network request问题的方法:在binance/api.py
中的requests.post()
调用中添加一个timeout
参数。具体的代码如下:
requests.post(url, timeout=10)
在上述代码中,timeout=10
表示设置超时时间为10秒。你可以根据实际情况设置合适的超时时间。
通过添加超时时间,我们可以确保当服务器没有及时响应时,请求不会挂起,从而解决Hanging thread waiting for network request问题。