有一个很好的方法来做到以下几点?
我写了一个简单的控制台应用程序,使用ftplib从FTP服务器上传和下载文件.
每次下载一些数据块时,我都想更新文本进度条,即使它只是一个数字.
但我不想删除所有打印到控制台的文本.(执行"清除"然后打印更新的百分比.)
我有以下功能和字典理解:
def function(name, params):
results = fits.open(name)
<do something more to results>
return results
dictionary = {name: function(name, params) for name in nameList}
Run Code Online (Sandbox Code Playgroud)
并希望将其并行化.有什么简单的方法吗?
在这里,我看到该multiprocessing模块可以使用,但无法理解如何使它将我的结果传递给我的字典.
注意:如果可能,请给出一个可以应用于任何返回结果的函数的答案.
注2:主要是操纵拟合文件并将结果分配给一个类
UPDATE
所以这里最终对我有用(来自@code_onkel回答):
def function(name, params):
results = fits.open(name)
<do something more to results>
return results
def function_wrapper(args):
return function(*args)
params = [...,...,..., etc]
p = multiprocessing..Pool(processes=(max([2, mproc.cpu_count() // 10])))
args_generator = ((name, params) for name in names)
dictionary = dict(zip(names, p.map(function_wrapper, args_generator)))
Run Code Online (Sandbox Code Playgroud)
使用tqdm只能部分工作,因为我可以使用我的自定义栏,因为tqdm恢复到只有迭代的默认栏.
我发现这篇文章解释了如何使用 ctr+c 终止正在运行的多处理代码。以下代码完全正常工作(可以使用 ctrl+c 终止它):
#!/usr/bin/env python
# Copyright (c) 2011 John Reese
# Licensed under the MIT License
import multiprocessing
import os
import signal
import time
def init_worker():
signal.signal(signal.SIGINT, signal.SIG_IGN)
def run_worker():
time.sleep(15)
def main():
print "Initializng 5 workers"
pool = multiprocessing.Pool(5, init_worker)
print "Starting 3 jobs of 15 seconds each"
for i in range(3):
pool.apply_async(run_worker)
try:
print "Waiting 10 seconds"
time.sleep(10)
except KeyboardInterrupt:
print "Caught KeyboardInterrupt, terminating workers"
pool.terminate()
pool.join()
else:
print "Quitting normally"
pool.close()
pool.join() …Run Code Online (Sandbox Code Playgroud)