首页 > 解决方案 > Python 'progress' 模块在函数中不显示来自 os.fork() 的微调器

问题描述

我想使用进度模块,但是,似乎微调器在函数内的 os.fork() 内不起作用。例如:

import sys, time, signal, os
from progress.spinner import MoonSpinner


def spinner_func():
    spinner = MoonSpinner('this is a test')
    pid = os.fork()
    if pid == 0:
        while True:
            time.sleep(0.1)
            spinner.next()
        exit()

    # Some long-running, blocking action would normally go here
    time.sleep(20)

    os.kill(pid, signal.SIGTERM)
    spinner.finish()
    print('Done!!')

相同的代码在函数之外工作,因为它显示微调器直到执行结束。我不确定如何在函数中使用这个模块,有什么想法吗?

标签: python-3.xfunctionforkprogress

解决方案


'spinner' 变量必须在子进程内部赋值,并且可以通过 multiprocessing.Queue() 发送给父进程

例如:

import sys, time, signal, os, multiprocessing
from progress.spinner import MoonSpinner


def spinner_func():
    q = multiprocessing.Queue()
    pid = os.fork()
    if pid == 0:
        spinner = MoonSpinner('this is a test') # <<--notify
        q.put(spinner)
        while True:
            time.sleep(0.1)
            spinner.next()
        exit()

    time.sleep(20)
    os.kill(pid, signal.SIGTERM)
    spinner = q.get()
    spinner.finish()
    print('Done!!')

spinner_func()

推荐阅读