【发布时间】:2020-06-16 10:28:21
【问题描述】:
我正在使用multiprocessing计算大量数据;即我定期生成一个进程,以便进程总数等于我机器上的 CPU 数量。
我会定期打印出整个计算的进度……但这不方便地穿插着 Python 的每个孩子的欢迎信息!
需要明确的是,由于多处理的处理方式,这是一个 Windows 特定问题。
例如
> python -q my_script.py
Python Version: 3.7.7 on Windows
然后打印相同版本消息的许多后续副本;每个子进程一个。 我怎样才能抑制这些?
我了解,如果您在命令行中使用 -q 标志运行 Python,则会抑制欢迎消息;虽然我不知道如何将其翻译成我的脚本。
编辑:
我尝试像这样包含解释器标志-q:
multiprocessing.set_executable(sys.executable + ' -q')
还是无济于事。我收到了FileNotFoundError,它告诉我由于它们检查参数的方式,我无法以这种方式传递选项。
不管怎样,这里是相关的代码部分(它是一个完整的函数):
def _parallelize(self, buffer, func, cpus):
## Number of Parallel Processes ##
cpus_max = mp.cpu_count()
cpus = min(cpus_max, cpus) if cpus else int(0.75*cpus_max)
## Total Processes to-do ##
N = ceil(self.SampleLength / DATA_MAX) # Number of Child Processes
print("N: ", N)
q = mp.Queue() # Child Process results Queue
## Initialize each CPU w/ a Process ##
for p in range(min(cpus, N)):
mp.Process(target=func, args=(p, q)).start()
## Collect Validation & Start Remaining Processes ##
for p in tqdm(range(N)):
n, data = q.get() # Collects a Result
i = n * DATA_MAX # Shifts to Proper Interval
buffer[i:i + len(data)] = data # Writes to open HDF5 file
if p < N - cpus: # Starts a new Process
mp.Process(target=func, args=(p + cpus, q)).start()
第二次编辑:
我应该提一下,我在 anaconda 环境中做所有事情。
【问题讨论】:
-
你是如何生成一个子进程来打印欢迎信息的?
-
也许重新定义指向 python exe 的环境变量,因为 python -q 会起作用?可以试试吗?
-
如果您编辑您的问题并添加相关代码 sn-p 在您确切生成进程的位置,这将非常有帮助。通常,您可以填写
args=(...,)之类的内容。但是如果不看看你到目前为止做了什么,就很难猜到。 -
这看起来你正在重写
multiprocessing.Pool。您不使用它有什么特别的原因吗? -
@AronLloyd 尽管
Pool工作人员通常会返回他们处理过的数据,但没有什么可以阻止他们将数据写入磁盘。例如,有时我让工作人员只返回他们处理过的项目的名称/编号的 2 元组和一个bool以指示它是否已成功处理。处理后的数据本身直接写入磁盘。
标签: python windows python-multiprocessing