Hej, staram się przyspieszyć mój kod, używając multiprocessing basenem i teoretycznie:

    def render_frame(i):
        #os.system(f'python main.py video_imgs/out{i}.png {convo}')
        print(f'done {i}')
    
    if __name__ == '__main__':
        pic_list = list(range(1,num_of_pics))
        with Pool(10) as p:
            s = p.map(render_frame,pic_list)

Powinien być wykonany, a następnie numer I, ale kiedy uruchomię skrypt, daje mi monit wejściowy, który mam na początku skryptu 10 razy, który jest ->

    from multiprocessing import Pool
    import sys
    import os
    import time
    
    if(len(sys.argv) > 1):
        vidLoc = sys.argv[1]
        convo = sys.argv[2]
    else:
        vidLoc = input('video: ') #! <-- this is being repeated 10 times
        convo = input('convolute cfg file: ')

Jakaś pomoc? dzięki

0
Programming Nerd 21 listopad 2020, 05:40

1 odpowiedź

Najlepsza odpowiedź

W systemach, które używają 'spawn' jako domyślnej metody startowej multiprocessing (Windows, MacOS), ty musi osłona wszystkich zachowań "główny skrypt" pod if __name__ == '__main__': strzec. Metoda 'spawn' symuluje fork, importując moduł główny w każdym procesie dziecka, ale z nazwą nie - __main__; Jeśli robisz coś takiego jak dzwonienie {x6}} poza strażnikiem, zostanie wykonany w procesach dziecięcych. Ogólnie rzecz biorąc, powinieneś trzymać się prostego importu i funkcji / klas / ciągłe definicje poza strażnikiem, nigdy nie robią nic "aktywnego", chyba że jesteś pod osłoną (np. Unikaj wywołujących funkcji z obserwowalnymi działaniami boku, jak input).

Uprawnij kod input prawidłowo (możesz po prostu pominąć go, ponieważ jest to dziwne, aby umożliwić opcjonalne argumenty wiersza poleceń, o które pojawiają się w inny sposób i denerwujące, aby mieć je odzwierciedlone w procesach dziecka), a jeśli musisz użyć { {X1}}, znajdź inne sposoby zainicjowania zmiennych w procesie dziecka (np. Za pomocą funkcji initializer za pomocą initargs, oba są opcjonalne argumenty do Pool).

Szorstki przykład (Twój niekompletny kod utrudnia dopasowanie dokładnie):

from multiprocessing import Pool
import sys
import os
import time

def render_frame(i):
    #os.system(f'python main.py video_imgs/out{i}.png {convo}')
    print(f'done {i}')

def set_globals(v, c):
    global vidLoc, convo
    vidLoc = v
    convo = c

if __name__ == '__main__':
    if len(sys.argv) > 1:
        vidLoc = sys.argv[1]
        convo = sys.argv[2]
    else:
        vidLoc = input('video: ') #! <-- this is being repeated 10 times
        convo = input('convolute cfg file: ')

    pic_list = list(range(1,num_of_pics))
    with Pool(10, initializer=set_globals, initargs=(vidLoc, convo)) as p:
        s = p.map(render_frame,pic_list)
1
ShadowRanger 21 listopad 2020, 03:19