我正在开发一个命令行界面,希望在其中一个参数中使用multiprocessing
来选择核心用法。我试图解决这样一个问题:当用户不调用-c
命令来获取核心使用率时,我想提示他并询问他是否希望从默认的1
增加核心使用率。我面临的问题是,即使在我请求用户选择并用parser.set_default
更改默认值之后,程序的核心用法仍然是1。使用parser.get_default
我可以看到默认值是用户选择的。然而,它似乎仍然只有一个核心运行。我不是粘贴所有的代码,只是相关的部分。你知道吗
编辑:
这个程序是这个脚本here的一个稍加修改的版本
parser.add_argument( "-o", "--specifycores", type = int,help= "Allows user to select number of cores for multiprocessing and faster uploads",default = 1 )
@contextlib.contextmanager
def multimap(cores=1):
if cores == 1:
if multiprocessing.cpu_count == 1:
cores = multiprocessing.cpu_count()
else:
print( 'You have {0} cores available.'.format( multiprocessing.cpu_count() ) )
while yes_no( 'Would you like to increase your core usage' ):
try:
cores = int( raw_input( 'Please enter the number or cores you wish to use: ') )
except ValueError:
print ( 'Please enter a valid number between 1 and {0}'.format( multiprocessing.cpu_count() ) )
else:
if cores > multiprocessing.cpu_count():
print ( 'Please enter a valid number between 1 and {0}'.format( multiprocessing.cpu_count() ) )
else:
parser.set_defaults(specifycores = cores)
break
cores = parser.get_default('specifycores')
print ( 'Uploading with {0} cores at {1}% usage'.format( cores, cores*100/multiprocessing.cpu_count() ) )
def wrapper(func):
def wrap(self, timeout=None):
return func(self, timeout=timeout if timeout is not None else 1e100)
return wrap
IMapIterator.next = wrapper(IMapIterator.next)
pool = multiprocessing.Pool(cores)
yield pool.imap
pool.terminate()
def _multipart_upload(bucket, s3_key_name, tarball, mb_size, use_rr=True,
cores=parser.get_default('specifycores')):
#some code
with multimap(cores) as pmap:
for _ in pmap(transfer_part, ( (mp.id, mp.key_name, mp.bucket_name, i, part)
for (i, part) in
enumerate( split_file ( tarball, mb_size, cores ) ) ) ):
pass
mp.complete_upload()
def main_for_multipupload(transfer_file, s3_key_name=None, use_rr=True,make_public=False, cores=1):
'''
Calls the _multipart_upload function and passes the required parameters to it
'''
#some code
mb_size = os.path.getsize(transfer_file) / 1e6
_multipart_upload(bucket, s3_key_name, transfer_file, mb_size, use_rr,
parser.get_default('specifycores'))
#main
try:
if args.specifycores > 1:
if multiprocessing.cpu_count() < args.specifycores:
main_for_multipupload( file_name, k.key, use_rr=True, make_public=False, cores=1)
else:
main_for_multipupload( file_name, k.key, use_rr=True, make_public=False, cores=args.specifycores)
else:
main_for_multipupload( file_name, k.key, use_rr=True, make_public=False, cores=parser.get_default('specifycores') )
end_time = timer()
print ( 'Time taken - {0} seconds'.format( str( int( end_time - start_time ) ) ) )
except Exception as e:
print e
我没有检查过你所有的代码(与你的明显意图相反,你发布了很多不相关的代码),但是当你声明的意图是没有默认值(如果用户没有指定默认值,你会退回到默认值)时,你通过指定默认值显然使事情变得复杂。你知道吗
您不应该指定默认值,或者将sentinel值放在域范围之外
对于必须是自然数的值,其他常见的no-op默认值是
None
或-1;或者只是不放置默认值,如果值未设置,则提示。你知道吗相关问题 更多 >
编程相关推荐