【发布时间】:2020-08-09 06:48:45
【问题描述】:
我有以下有效的脚本,我试图避免在同一个模块中使用'__main__':
def download():
urls = \
[
'https://ipleak.net/json',
'https://httpbin.org/get'
] * 4
downloads = asyn.init_download(urls, "json")
return downloads
def pprint_json(d):
print(json.dumps(d, indent=4, sort_keys=True))
def multiprocess_list(n_pools, func, list):
executor = concurrent.futures.ProcessPoolExecutor(n_pools)
futures = [executor.submit(func, item) for item in list]
concurrent.futures.wait(futures)
if __name__ == '__main__':
multiprocess_list(4, pprint_json, download())
download() 函数,顾名思义,使用asyncio 和aiohttp 异步下载urls。
我想从任何地方“全局”执行multiprocess_list:
def multiprocess_list(n_pools, func, list):
executor = concurrent.futures.ProcessPoolExecutor(n_pools)
futures = [executor.submit(func, item) for item in list]
concurrent.futures.wait(futures)
def main(args):
parser = argparse.ArgumentParser(description="Multiprocessing a list.")
parser.add_argument("-n", "--n_pools", type=int, required=True)
parser.add_argument("-f", "--function", required=True)
parser.add_argument("-l", "--list", required=True)
args = parser.parse_args(args)
multiprocess_list(args.n_pools, args.function, args.list)
if __name__ == '__main__':
import sys
main(sys.argv[1:])
将上面的 module 导入到任何其他 python 文件中,并可能像这样运行它:(虽然不起作用)
def download():
urls = \
[
'https://ipleak.net/json',
'https://httpbin.org/get'
] * 4
downloads = asyn.init_download(urls, "json")
return downloads
def pprint_json(d):
print(json.dumps(d, indent=4, sort_keys=True))
mp.main(["-n", 4, "-f", pprint_json, "-l", download()])
这给了我一个错误:
if not arg_string[0] in self.prefix_chars: TypeError: 'int' object is not subscriptable
因此,将一个参数作为要运行的函数传递,将另一个参数作为列表或返回类似download() 的列表的函数传递。
- 这可以在 python 中完成吗?
- 如果是,有人可以解释一下吗?
- 我的方法是正确的还是完全失去了它?
注意:我的解释器使用 Python3.8,我对 python 有点陌生,请多多包涵。
【问题讨论】:
-
“虽然不起作用”?你得到什么错误?
标签: python multithreading module arguments argparse