gpt4 book ai didi

python - 同时运行多个独立的python脚本

转载 作者:行者123 更新时间:2023-12-03 13:15:59 24 4
gpt4 key购买 nike

我的目标是创建一个主要的 python 脚本,在 windows server 2012 中同时执行多个独立的 python 脚本。我认为的好处之一是我可以将任务调度程序指向一个 main.py脚本而不是多个 .py脚本。我的服务器有 1 个 CPU。我已阅读 multiprocessing , thread & subprocess这只会增加我的困惑。在美国东部标准时间 9:30 开市后,我基本上同时为不同的股票代码运行多个交易脚本。以下是我的尝试,但我不知道这是否正确。非常感谢任何方向/反馈!

import subprocess

subprocess.Popen(["python", '1.py'])
subprocess.Popen(["python", '2.py'])
subprocess.Popen(["python", '3.py'])
subprocess.Popen(["python", '4.py'])

最佳答案

我想我会尝试这样做:

from multiprocessing import Pool

def do_stuff_with_stock_symbol(symbol):
return _call_api()

if __name__ == '__main__':
symbols = ["GOOG", "APPL", "TSLA"]
p = Pool(len(symbols))
results = p.map(do_stuff_with_stock_symbol, symbols)
print(results)

(多处理介绍中的修改示例: https://docs.python.org/3/library/multiprocessing.html#introduction)

如果您处理大量股票代码,请考虑使用恒定的池大小,因为每个 python 进程都会使用一些内存。

另外,请注意,如果您正在处理 I/O 绑定(bind)的工作负载(调用 API、从磁盘写入和读取),使用线程可能会好得多。在处理计算绑定(bind)的工作负载时(由于全局解释器锁),python 确实需要进程。

使用线程和并发 future 库的示例是:
import concurrent.futures

TIMEOUT = 60

def do_stuff_with_stock_symbol(symbol):
return _call_api()

if __name__ == '__main__':
symbols = ["GOOG", "APPL", "TSLA"]

with concurrent.futures.ThreadPoolExecutor(max_workers=len(symbols)) as executor:
results = {executor.submit(do_stuff_with_stock_symbol, symbol, TIMEOUT): symbol for symbol in symbols}

for future in concurrent.futures.as_completed(results):
symbol = results[future]
try:
data = future.result()
except Exception as exc:
print('{} generated an exception: {}'.format(symbol, exc))
else:
print('stock symbol: {}, result: {}'.format(symbol, data))

(修改示例来自: https://docs.python.org/3/library/concurrent.futures.html#threadpoolexecutor-example)

请注意,线程仍将使用一些内存,但少于进程。

如果您想将每个股票代码的内存消耗降至最低,您可以使用 asyncio 或绿色线程,但在某些时候,由于所有并发 API 调用,您会遇到网络带宽问题 :)

关于python - 同时运行多个独立的python脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47538776/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com