[英]Parsing arguments using argparse and mpi4py
我想在MPI下的多個並行進程中運行Python腳本,並且需要傳遞命令行參數。 我在Python中使用argparse模塊,但有時會有些混亂。 如果我沒有指定正確的參數,則所有進程都會抱怨,因此我會得到同一錯誤消息的許多副本。
我嘗試僅使進程0解析參數,然后將結果廣播給其他進程,但是當解析失敗並且沒有廣播任何內容時,其他進程將掛起。
如何解析命令行參數,並在解析失敗時打印一條可讀消息?
額外的一塊,我需要的是包裝一個try /終於在周圍的過程0。參數解析工序在finally塊,播放一些東西到其他進程。 如果解析失敗,您將廣播None
,並且它們都可以靜默退出。
from mpi4py import MPI
from time import sleep
import argparse
def parseOptions(comm):
parser = argparse.ArgumentParser(
description='Print some messages.')
parser.add_argument('iteration_count', help='How many times', type=int)
parser.add_argument('message',
help='What to say',
nargs=argparse.OPTIONAL,
default='Hello, World!')
args = None
try:
if comm.Get_rank() == 0:
args = parser.parse_args()
finally:
args = comm.bcast(args, root=0)
if args is None:
exit(0)
return args
def main():
comm = MPI.COMM_WORLD # @UndefinedVariable
rank = comm.Get_rank()
size = comm.Get_size()
args = parseOptions(comm)
if rank == 0:
print args.message
for i in range(args.iteration_count):
if i%size == rank:
print '{} in rank {} started.'.format(i, rank)
sleep(.5)
print '...'
sleep(.5)
print '{} in rank {} ended.'.format(i, rank)
if __name__ == '__main__':
main()
我使用以下命令運行代碼:
mpirun -np 4 python scratch.py 13
如果遇到錯誤情況,通常最簡單的方法是使進程中止而不是嘗試進行一些花哨的清理工作。 在您的情況下,您可能只是讓原始進程(等級0)調用abort並導致其他所有人退出:
comm.abort()
這樣,您就不會讓每個人都試圖匹配結果。 他們只是自動中止。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.