如何将python for循环从顺序转换为并行运行
Posted
技术标签:
【中文标题】如何将python for循环从顺序转换为并行运行【英文标题】:How to convert a python for loop from sequential to run parallel 【发布时间】:2021-11-22 08:56:05 【问题描述】:我刚刚了解了 python 中的异步和并行函数。我可以并行运行一个 for 循环,并且函数可以并行运行,而不是等待第一个结束后再调用下一个。
我有以下功能,我想在羊驼交易平台上并行运行。
我有多个账户,我希望在它们上并行执行一些交易。
下面的代码只是获取帐户信息的简单代码。我的最终代码会更复杂。
如何并行运行?
import alpaca_trade_api as tradeapi
keys = [['apikey1','secretkey1'],['apikey2','secretkey2'],['apikey3','secretkey3']]
for key in keys:
print(key)
api = tradeapi.REST(key[0],key[1])
conn = tradeapi.StreamConn(key[0],key[1])
account = api.get_account()
account.status
print(float(account.equity))
print(float(account.last_equity))
print(float(account.equity) - float(account.last_equity))
所以为了并行运行,我尝试了这个,
import multiprocessing
def printstats(key):
print(key)
api = tradeapi.REST(key[0],key[1])
conn = tradeapi.StreamConn(key[0],key[1])
account = api.get_account()
account.status
print(float(account.equity))
print(float(account.last_equity))
print(float(account.equity) - float(account.last_equity))
a_pool = multiprocessing.Pool()
result = a_pool.map(printstats, keys)
print(result)
但它只是永远运行并且不打印任何东西。
如果我正常运行该 for 循环,它就可以工作。
我做错了什么?我应该使用异步而不是这个吗?有什么区别?
【问题讨论】:
【参考方案1】:对于multiprocessing
模块,您不能在代码的顶层启动子进程。如果您只是包装这 3 行以使它们仅在脚本执行时运行而不是在调用/导入时运行,则子进程将能够产生。
if __name__ == '__main__':
a_pool = multiprocessing.Pool()
result = a_pool.map(printstats, keys)
print(result)
较新的语法,一旦离开代码块就会自动关闭进程池。
if __name__ == '__main__':
with multiprocessing.Pool() as pool:
res = pool.map(printstats, keys)
print(res)
关于异步/等待的注意事项:
Async / await 用于异步代码(非阻塞)而不是并行代码。
如果您想了解更多,这篇文章涵盖了所有不同的术语:https://phuctm97.com/blog/sync-async-concurrent-parallel
【讨论】:
感谢您的回答,如果您有时间,请您也做一个 async / await 示例,因为我拥有的这段代码不依赖于它的执行顺序以上是关于如何将python for循环从顺序转换为并行运行的主要内容,如果未能解决你的问题,请参考以下文章