悬挂线程等待网络请求。

10 浏览
0 Comments

悬挂线程等待网络请求。

我有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我已经询问过如果我的代码卡住了如何引发异常,但是由于无法从外部取消正在运行的线程,所以这是不可能的。

0
0 Comments

文章标题:解决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问题。

0