重写默认值

2024-03-28 05:44:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在开发一个命令行界面,希望在其中一个参数中使用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

Tags: keynamedefaultparserforifusecount
1条回答
网友
1楼 · 发布于 2024-03-28 05:44:13

我没有检查过你所有的代码(与你的明显意图相反,你发布了很多不相关的代码),但是当你声明的意图是没有默认值(如果用户没有指定默认值,你会退回到默认值)时,你通过指定默认值显然使事情变得复杂。你知道吗

您不应该指定默认值,或者将sentinel值放在域范围之外

parser.add_option(default = 0)
...
if value == 0:
    value = input ("value: ")

对于必须是自然数的值,其他常见的no-op默认值是None或-1;或者只是不放置默认值,如果值未设置,则提示。你知道吗

相关问题 更多 >