Несколько процессов печатаются неправильно, как они могут печатать в один и тот же stdscr ()? - PullRequest
0 голосов
/ 26 марта 2019

Я работаю в приложении для разархивирования, и я хочу использовать несколько процессов, чтобы разархивировать несколько файлов из каталога, и я хочу иметь экран, чтобы знать о каждом процессе и о том, что это такое, я действительноновичок в программировании на Python, и я также новичок в многопроцессорности

Когда я составляю этот скрипт, я хочу видеть состояние каждого процесса, но вместо этого файлы просто распаковываются, и на экран ничего не выводится,пока сценарий не разархивируется и не закончится.Может кто-нибудь объяснить, почему на экране нет отпечатков?

import os, zipfile
from multiprocessing import Process
from unicurses import*
import time
dir_name = 'E:\zips'
extension = ".zip"
processes = 3
os.chdir(dir_name)
def unzipper(item,files,poz,no_proc):
    if(item.endswith(extension)):
        move(no_proc*2,5)
        addstr(f"#{no_proc} -> working on {item}...\n")
        getch()
        file_name = os.path.abspath(item)
        zip_ref = zipfile.ZipFile(file_name)
        zip_ref.extractall(dir_name)
        zip_ref.close()
        move(no_proc*2,5)
        addstr(f"#{no_proc} finised processing {item}.\n")
        if(poz-processes>=0):
            item=files.pop(poz-processes)
            unzipper(item, files,poz-processes,no_proc)
    else:
        os.kill(os.getpid())
if __name__ == '__main__':
    stdscr=initscr()
    print(os.getpid())
    procs = []
    i=0
    list = os.listdir(dir_name)
    files=[]
    for i in range(0,len(list)):
        if(list[i].endswith(extension)):
            files.append(list[i])
    for no_proc in range(0,processes):
        move((no_proc+1)*2,5)
        addstr(f"#{no_proc} -> ")    
    for no_proc in range(0,processes):
        if(files!=[]):
            item=files.pop()
            proc = Process(target=unzipper, args=(item,files,len(files),no_proc+1))
            procs.append(proc)
            proc.start()

    for proc in procs:
        proc.join()
...