2013-08-14 6 views
9

Mam poniżej fragment kodu, który tworzy kilka wątków, aby wykonać zadanie, które działa doskonale na własną rękę. Jednak staram się zrozumieć, dlaczego instrukcje drukowania, które wywołuję w mojej funkcji, nie są wykonywane, dopóki wszystkie wątki nie zakończą się i nie zostanie wywołana instrukcja print 'finished'. Oczekuję, że zostaną wywołani podczas wykonywania wątku. Czy istnieje prosty sposób, aby to osiągnąć i dlaczego to działa w ten sposób?Wielowątkowe instrukcje drukowania w Pythonie są opóźnione do momentu zakończenia wszystkich wątków.

def func(param): 
    time.sleep(.25) 
    print param*2 

if __name__ == '__main__': 
    print 'starting execution' 
    launchTime = time.clock() 
    params = range(10) 
    pool=multiprocessing.Pool(processes=100) #use N processes to download the data 
    _=pool.map(func,params) 
    print 'finished' 
+2

Tylko myślałem, że podkreślić, że jest to [Duplikat] (http://stackoverflow.com/ pytania/12622365/problems-mixing-threads-processes-in-python) innego (nieodebranego) pytania zadawanego tutaj na SO, ale o wiele mniej zagraconego. – Hawkwing

+0

Czy masz na myśli, że wszystkie odbitki pojawiają się od razu, lub ich oczekiwana kolejność jest odwrócona? Jeśli pójdą w tym samym czasie to prawdopodobnie system buforuje. Jeśli zamówienie jest odwrócone, jest bardziej interesujące. – luk32

+1

Obie rzeczy, właściwie. Instrukcje drukowania pojawiają się wszystkie po wydrukowaniu "finshed". – Hawkwing

Odpowiedz

7

Dzieje się tak ze względu na standardowe buforowanie. Nadal można opróżnić buforów:

import sys 

print 'starting' 
sys.stdout.flush() 

można znaleźć więcej informacji na ten temat here i here.

+0

Buforowanie nie powinno zmieniać oczekiwanej kolejności wydruków, które moim zdaniem. – luk32

+1

Testowany. Dodanie sys.stdout.flush() po tym, jak instrukcja print powoduje, że wyprowadzają je przed zakończeniem, a także do drukowania, gdy kończy się każdy wątek, zamiast czekać do końca. Plus, to bardzo czyste rozwiązanie! Akceptowanie. – Hawkwing

+1

Nie działa to dla mnie :(Wygląda na to, że moja kolejka wydruku nie może być obsługiwana –

5

dla Pythona 3 można teraz używać flush param tak:

print('Your text', flush=True)

Powiązane problemy