如何将 python for 循环从顺序循环转换为 运行 并行循环

How to convert a python for loop from sequential to run parallel

我刚刚在 python 中学习了异步和并行函数。我可以在哪里并行 运行 一个 for 循环,函数可以并行 运行 而不是在调用下一个之前等待第一个结束。

我有以下功能,我想 运行 在 alpaca 交易平台上并行使用。

我有多个账户,我希望一些交易在这些账户上并行执行。

下面的代码只是获取帐户信息的简单代码。我的最终代码会更复杂。

我怎样才能运行它并行?

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 循环正常工作。

我做错了什么?我应该使用异步而不是这个吗?有什么区别?

对于 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