挂起线程等待网络请求

问题描述 投票:0回答:1

我有 24/7 全天候运行的脚本,当 concurrent.futures 中的线程没有对请求做出响应时,有时会卡住。 我使用 concurrent.futures 线程池同时向 Broker 发送请求。所以,每个线程都是一些简单的东西,比如一个请求账户余额或发送订单的函数。我需要那些执行或失败的线程才能继续,因为每个进一步的操作都需要通过之前的线程获取的数据。

下面是两个简单的订单函数和并发期货的例子。

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)

挂起的线程模块打印出哪个线程挂起以及原因:

Thread 139646566659840 "ThreadPoolExecutor-666849_1" hangs -                                                                                                                                                                                     
    File "/usr/lib/python3.9/threading.py", line 912, in _bootstrap                                                                                                                                                                          
            self._bootstrap_inner()                                                                                                                                                                                                          
    File "/usr/lib/python3.9/threading.py", line 954, in _bootstrap_inner                                                                                                                                                                    
            self.run()                                                                                                                                                                                                                       
    File "/usr/lib/python3.9/threading.py", line 892, in run                                                                                                                                                                                 
            self._target(*self._args, **self._kwargs)                                                                                                                                                                                        
    File "/usr/lib/python3.9/concurrent/futures/thread.py", line 77, in _worker                                                                                                                                                              
            work_item.run()                                                                                                                                                                                                                  
    File "/usr/lib/python3.9/concurrent/futures/thread.py", line 52, in run                                                                                                                                                                  
            result = self.fn(*self.args, **self.kwargs)                                                                                                                                                                                      
    File "/home/user/binance_bot.py", line 1346, in sell_orders_3                                                                                                                                                                 
            order = client.new_order(symbol = ticker, side = 'SELL', type = 'LIMIT_MAKER', quantity = xquantity, price = xprice)                                                                                                             
    File "/home/user/.local/lib/python3.9/site-packages/binance/spot/trade.py", line 68, in new_order                                                                                                                                   
            return self.sign_request("POST", url_path, params)                                                                                                                                                                               
    File "/home/user/.local/lib/python3.9/site-packages/binance/api.py", line 83, in sign_request                                                                                                                                       
            return self.send_request(http_method, url_path, payload)                                                                                                                                                                         
    File "/home/user/.local/lib/python3.9/site-packages/binance/api.py", line 115, in send_request                                                                                                                                      
            response = self._dispatch_request(http_method)(**params)                                                                                                                                                                         
    File "/home/user/.local/lib/python3.9/site-packages/requests/sessions.py", line 635, in post                                                                                                                                        
            return self.request("POST", url, data=data, json=json, **kwargs)                                                                                                                                                                 
    File "/home/user/.local/lib/python3.9/site-packages/requests/sessions.py", line 587, in request                                                                                                                                     
            resp = self.send(prep, **send_kwargs)                                                                                                                                                                                            
    File "/home/user/.local/lib/python3.9/site-packages/requests/sessions.py", line 701, in send                                                                                                                                        
            r = adapter.send(request, **kwargs)                                                                                                                                                                                              
    File "/home/user/.local/lib/python3.9/site-packages/requests/adapters.py", line 489, in send                                                                                                                                        
            resp = conn.urlopen(                                                                                                                                                                                                             
    File "/home/user/.local/lib/python3.9/site-packages/urllib3/connectionpool.py", line 703, in urlopen                                                                                                                                
            httplib_response = self._make_request(                                                                                                                                                                                           
    File "/home/user/.local/lib/python3.9/site-packages/urllib3/connectionpool.py", line 444, in _make_request                                                                                                                          
            httplib_response = conn.getresponse()                                                                                                                                                                                            
    File "/usr/lib/python3.9/http/client.py", line 1347, in getresponse                                                                                                                                                                      
            response.begin()                                                                                                                                                                                                                 
    File "/usr/lib/python3.9/http/client.py", line 307, in begin                                                                                                                                                                             
            version, status, reason = self._read_status()                                                                                                                                                                                    
    File "/usr/lib/python3.9/http/client.py", line 268, in _read_status                                                                                                                                                                      
            line = str(self.fp.readline(_MAXLINE + 1), "iso-8859-1") 
File "/usr/lib/python3.9/socket.py", line 704, in readinto                                                                                                                                                                       [0/1893]
            return self._sock.recv_into(b)
    File "/usr/lib/python3.9/ssl.py", line 1241, in recv_into
            return self.read(nbytes, buffer)
    File "/usr/lib/python3.9/ssl.py", line 1099, in read 
            return self._sslobj.read(len, buffer)

Thread 139646533089024 "ThreadPoolExecutor-666849_0" hangs - 
    File "/usr/lib/python3.9/threading.py", line 912, in _bootstrap
            self._bootstrap_inner()
    File "/usr/lib/python3.9/threading.py", line 954, in _bootstrap_inner
            self.run()
    File "/usr/lib/python3.9/threading.py", line 892, in run
            self._target(*self._args, **self._kwargs)
    File "/usr/lib/python3.9/concurrent/futures/thread.py", line 77, in _worker
            work_item.run()
    File "/usr/lib/python3.9/concurrent/futures/thread.py", line 52, in run
            result = self.fn(*self.args, **self.kwargs)
    File "/home/user/binance_bot.py", line 1298, in sell_orders_0
            order = client.new_order(symbol = ticker, side = 'SELL', type = 'LIMIT_MAKER', quantity = xquantity, price = xprice)
    File "/home/user/.local/lib/python3.9/site-packages/binance/spot/trade.py", line 68, in new_order
            return self.sign_request("POST", url_path, params)
    File "/home/user/.local/lib/python3.9/site-packages/binance/api.py", line 83, in sign_request
            return self.send_request(http_method, url_path, payload)
    File "/home/user/.local/lib/python3.9/site-packages/binance/api.py", line 115, in send_request
            response = self._dispatch_request(http_method)(**params)
    File "/home/user/.local/lib/python3.9/site-packages/requests/sessions.py", line 635, in post
            return self.request("POST", url, data=data, json=json, **kwargs)
    File "/home/user/.local/lib/python3.9/site-packages/requests/sessions.py", line 587, in request
            resp = self.send(prep, **send_kwargs)
    File "/home/user/.local/lib/python3.9/site-packages/requests/sessions.py", line 701, in send
            r = adapter.send(request, **kwargs)
    File "/home/user/.local/lib/python3.9/site-packages/requests/adapters.py", line 489, in send
            resp = conn.urlopen(
    File "/home/user/.local/lib/python3.9/site-packages/urllib3/connectionpool.py", line 703, in urlopen
            httplib_response = self._make_request(
    File "/home/user/.local/lib/python3.9/site-packages/urllib3/connectionpool.py", line 444, in _make_request
            httplib_response = conn.getresponse()
    File "/usr/lib/python3.9/http/client.py", line 1347, in getresponse
            response.begin()
    File "/usr/lib/python3.9/http/client.py", line 307, in begin
            version, status, reason = self._read_status()
    File "/usr/lib/python3.9/http/client.py", line 268, in _read_status
            line = str(self.fp.readline(_MAXLINE + 1), "iso-8859-1")
    File "/usr/lib/python3.9/socket.py", line 704, in readinto
            return self._sock.recv_into(b)
    File "/usr/lib/python3.9/ssl.py", line 1241, in recv_into
            return self.read(nbytes, buffer)
    File "/usr/lib/python3.9/ssl.py", line 1099, in read 
            return self._sslobj.read(len, buffer)
---------Thread 139646838966080 "MainThread" hangs --------- 
    File "/home/user/binance_bot.py", line 1596, in <module>
            buys_0 = executor.submit(buy_orders_0)
    File "/usr/lib/python3.9/concurrent/futures/_base.py", line 628, in __exit__
            self.shutdown(wait=True)
    File "/usr/lib/python3.9/concurrent/futures/thread.py", line 229, in shutdown
            t.join()
    File "/usr/lib/python3.9/threading.py", line 1033, in join
            self._wait_for_tstate_lock()
    File "/usr/lib/python3.9/threading.py", line 1049, in _wait_for_tstate_lock
            elif lock.acquire(block, timeout):

我怎样才能使我的代码非阻塞?

已经问过我的代码挂起时如何引发异常,但这是不可能的,因为从外部取消正在运行的线程是不可能的。

python threadpool binance concurrent.futures
1个回答
0
投票

您需要在

timeout
调用中添加一个
requests.post()
参数,大概在
binance/api.py
中的某处。

https://requests.readthedocs.io/en/latest/user/advanced/#timeouts 描述:

大多数对外部服务器的请求都应该附加超时,以防服务器没有及时响应。默认情况下,除非明确设置超时值,否则请求不会超时。如果没有超时,您的代码可能会挂起几分钟或更长时间。

© www.soinside.com 2019 - 2024. All rights reserved.