如何将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循环从顺序转换为并行运行的主要内容,如果未能解决你的问题,请参考以下文章

并行执行 n 次 for 循环迭代

为啥这种 for 循环并行化在 Python 中不起作用?

在 for 循环中不转换到下一个

如何使用范围将这个 python for 循环转换为 C++?

kettle作业 循环执行并行执行作业

使用 Numba 时如何并行化此 Python for 循环