【发布时间】:2021-10-03 07:21:18
【问题描述】:
我有一个非常简单的 Python 脚本,它从列表(6K+ 长)中读取一个股票代码,并获取一些数据来标记交易日期间的异常交易量。
如果我只是循环遍历代码文件中的每一行,则需要数小时才能运行。
基于谷歌搜索,我找到了这种多处理的粗略示例,并决定尝试实现它。
当我运行脚本时,它运行得更快,但也导致了一些我无法弄清楚的非常奇怪的问题。有时我会收到一个 redis 断路器错误,或者有时它会在代码文件的末尾附近停止并挂起。
有什么想法吗?
import yfinance as yf
import multiprocessing
import time
import logging
file = open("C:\\Users\\miner\\Desktop\\unusual.txt", 'w')
def main():
read_ticker_file()
def read_ticker_file():
file1 = open("C:\\Users\\miner\\Desktop\\tickers.txt", 'r')
lines = file1.readlines()
count = 0
ticker_arr = []
for line in lines:
count += 1
line = line.strip('\n')
line = line.strip()
ticker_arr.append(line)
return ticker_arr
def get_historical_data(symbol):
yahoo_ticker = yf.Ticker(symbol)
historical = yf.download(symbol, period="max", interval="1d")
average_volume_arr = historical['Volume']
try:
current_volume = yahoo_ticker.info['volume']
sum_volume = 0
for volume in average_volume_arr:
sum_volume += volume
average_volume = sum_volume / len(average_volume_arr)
if current_volume > average_volume:
volume_over_average = (current_volume - average_volume) / average_volume
volume_over_average = "{:.2%}".format(volume_over_average)
unusual_volume = (symbol + " - " + str(volume_over_average))
print(unusual_volume)
write_to_file(unusual_volume)
except Exception as e:
print(e)
def write_to_file(data):
file.writelines(data + "\n")
if __name__ == '__main__':
# start = time.time()
inputs = read_ticker_file()
pool = multiprocessing.Pool(processes=20)
pool.map(get_historical_data, inputs)
pool.close()
pool.join()
# end = time.time()
# print(start - end)
【问题讨论】:
-
我假设你的程序的瓶颈是下载?您是否总是了解您提到的问题?是否有可能您发送了太多查询并被目标服务器阻止?
-
@André 雅虎没有太多支持或文档可以肯定地说,但我不这么认为。我没有看到任何特定于服务器的错误。
-
我的另外两个问题呢?下载是瓶颈吗?运行代码时是否总是出现这些问题?
-
@André 如果我让它运行足够长的时间最终我总是得到 Redis CircuitBreaker 错误。据我所知,这与雅虎 api 无关。下载可能是瓶颈,是的
-
每当您使用
multiprocessing标记问题时,您也应该使用平台标记问题,例如windows或linux。我是否正确推断您在 Windows 下运行?如果是这样,池中的每个进程(全部 20 个)都将执行自己的file = open("C:\\Users\\miner\\Desktop\\unusual.txt", 'w')实例。因此,您将有 20 个进程打开以进行输出并并行写入同一个文件。这不是一件好事。如果是Linux,那么池中的每个进程都会继承已经打开的文件描述符,情况也好不了多少。
标签: python multithreading multiprocessing pool