Python在for循环期间冻结

2024-05-14 22:16:26 发布

您现在位置:Python中文网/ 问答频道 /正文

def get_price_history_data(ticker):
    pricelist = []
    try:
        pricedata = False
        tradingdays = 252
        Historical_Prices = pdr.get_data_yahoo(symbols=ticker, start=(datetime.today()-timedelta(tradingdays)), end=(datetime.today()))#-timedelta(years4-1)))
        price_df = pd.DataFrame(Historical_Prices)
        pricelist = price_df['Adj Close']
        pricedata = True
    except:
        print(ticker,' failed to get price data')
    return(pricelist, pricedata)

tickers = ['FB','V']

for ticker in tickers:
 [pricelist, pricedata] = get_price_data(ticker)

我有一个几千个列表,我通过这个循环运行。它输出一个单列df和一个布尔值。总的来说,它的工作刚刚好,做什么我需要它。但是,它不一致地无限期冻结,没有错误消息,并停止运行,迫使我关闭程序并从头开始重新运行。 如果经过了一定的时间,我正在寻找一种跳过for循环迭代的方法。我已经调查过了时间。睡眠()和continue函数,但无法确定如何将其应用于此特定应用程序。如果它冻结了,它就冻结在获取数据()节”。会有人来帮忙的


Tags: dffordatagettodaydatetimepricepricelist
1条回答
网友
1楼 · 发布于 2024-05-14 22:16:26

我猜get_data_yahoo()可能会冻结,因为它向服务器发出了某种请求,但从未得到响应。它没有超时选项,因此最明显的选项是在另一个线程/进程中启动它,如果需要的时间太长,则终止它。你可以使用concurrent.futures。一旦您对下面的代码的工作方式感到满意,就可以用get_price_history_data替换sleeps_for_a_while,用tickers替换(3, 1, 4, 0)。你知道吗

from concurrent.futures import ThreadPoolExecutor, TimeoutError
from time import sleep

TIMEOUT = 2  # seconds


def sleeps_for_a_while(sleep_for):
    print('starting {}s sleep'.format(sleep_for))
    sleep(sleep_for)
    print('finished {}s sleep'.format(sleep_for))

    # return a value to break out of the while loop
    return sleep_for * 100


if __name__ == '__main__':

    # this only works with functions that return values
    results = []
    for sleep_secs in (3, 1, 4, 0):
        with ThreadPoolExecutor(max_workers=1) as executor:
            # a future represents something that will be done
            future = executor.submit(sleeps_for_a_while, sleep_secs)
            try:
                # result() raises an error if it times out
                results.append(future.result(TIMEOUT))
            except TimeoutError as e:
                print('Function timed out')
                results.append(None)

    print('Got results:', results)

相关问题 更多 >

    热门问题