如何将 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
我刚刚在 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