簡體   English   中英

在 Python 中重復執行 function 的最佳方法是什么?

[英]What is the best way to repeatedly execute a function in Python?

我正在嘗試從網站中提取一些數據。 我遇到的問題是它會提取數據值,然后繼續不斷地重新打印它,而不是提取最新的實時數據值並更新它。 我從https://github.com/BitMEX/api-connectors/tree/master/official-ws/python得到代碼並做了一些更改。

from bitmex_websocket import BitMEXWebsocket
import logging
from time import sleep

# Basic use of websocket.
def run():
    logger = setup_logger()

    # Instantiating the WS will make it connect. Be sure to add your api_key/api_secret.
    ws = BitMEXWebsocket(endpoint="https://www.bitmex.com/api/v1", symbol="XBTUSD",
                         api_key=None, api_secret=None)

    logger.info("Instrument data: %s" % ws.get_instrument())

    # Run forever
    while(ws.ws.sock.connected):
        logger.info("Ticker: %s" % ws.get_ticker())
        if ws.api_key:
            logger.info("Funds: %s" % ws.funds())
        #logger.info("Market Depth: %s" % ws.market_depth())
        (logger.info("Recent Trades: %s\n\n" % ws.recent_trades()[0]["size"]))
        sleep(1)


def setup_logger():
    # Prints logger info to terminal
    logger = logging.getLogger()
    logger.setLevel(logging.INFO)  # Change this to DEBUG if you want a lot more info
    ch = logging.StreamHandler()
    # create formatter
    formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
    # add formatter to ch
    ch.setFormatter(formatter)
    logger.addHandler(ch)
    return logger


if __name__ == "__main__":
    run()

問題是您在 while 循環內的ws.get_ticker()調用實際上並沒有獲得更新的值。

來自: https://github.com/BitMEX/api-connectors/blob/febf95659ccd2aa5445e0178c4dbb008d1ae9286/official-ws/python/bitmex_websocket.py#L70

    def get_ticker(self):
        '''Return a ticker object. Generated from quote and trade.'''
        lastQuote = self.data['quote'][-1] # <--SEE HERE. It's just getting the
        lastTrade = self.data['trade'][-1] # information from when the ticker was
                                           # first established.
        ticker = {
            "last": lastTrade['price'],
            "buy": lastQuote['bidPrice'],
            "sell": lastQuote['askPrice'],
            "mid": (float(lastQuote['bidPrice'] or 0) + float(lastQuote['askPrice'] or 0)) / 2
        }

        # The instrument has a tickSize. Use it to round values.
        instrument = self.data['instrument'][0]
        return {k: round(float(v or 0), instrument['tickLog']) for k, v in ticker.items()}

請參閱定義lastQuotelastTrade的評論。 您應該在每個循環之后重新創建ws 如果您想永遠這樣做,則必須將 while 循環中的條件更改為while True

from bitmex_websocket import BitMEXWebsocket
import logging
from time import sleep

# Basic use of websocket.
def run():
    logger = setup_logger()




    logger.info("Instrument data: %s" % ws.get_instrument())

    # Run forever    
    while True:
        # Instantiating the WS will make it connect. Be sure to add your api_key/api_secret.
        ws = BitMEXWebsocket(endpoint="https://www.bitmex.com/api/v1", symbol="XBTUSD",
                             api_key=None, api_secret=None)
        logger.info("Ticker: %s" % ws.get_ticker())
        if ws.api_key:
            logger.info("Funds: %s" % ws.funds())
        #logger.info("Market Depth: %s" % ws.market_depth())
        (logger.info("Recent Trades: %s\n\n" % ws.recent_trades()[0]["size"]))
        ws.exit()
        sleep(1)


def setup_logger():
    # Prints logger info to terminal
    logger = logging.getLogger()
    logger.setLevel(logging.INFO)  # Change this to DEBUG if you want a lot more info
    ch = logging.StreamHandler()
    # create formatter
    formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
    # add formatter to ch
    ch.setFormatter(formatter)
    logger.addHandler(ch)
    return logger


if __name__ == "__main__":
    run()

編輯:在 while 循環中添加了對ws.exit()的調用,以便在打開新的之前優雅地關閉ws

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM