2016-04-05 10 views
1

Ich habe eine Fortschrittsbalken-Funktion. Ich möchte diesen Fortschrittsbalken ausführen, während die andere Funktion verarbeitet. Ich habe einen einfachen Testcode mit Multiprocessing-Modul geschrieben und es hat nicht gut funktioniert. Mein Code:Python Multiprocessing-Ausgabe

from multiprocessing import Process 
import time 

def foo(thread): 
    print time.ctime() 
    time.sleep(10) 
    print time.ctime() 

def progress_bar(timer = 10): 
    digits = 4 
    delete = '\b' * 6 
    time_slot = float(timer)/100 
    for i in range(1, 101): 
     delete_bar = '\b' * 52 
     if i == 1: 
      bar = '|' + ' ' * 50 + '|' 
     else: 
      bar = '|' + '=' * (i/2 - 1) + '>' + ' ' * (50 - i/2) + '|' 
     print "{0}{1:{2}}{3}{4}".format(delete, str(i) + '%', digits, bar, delete_bar), 
     time.sleep(time_slot) 
    print '' 

def main(): 
    p1 = Process(target = foo1('this')) 
    p1.start() 
    p2 = Process(target = progress_bar()) 
    p2.start() 
    p1.join() 
    p2.join() 

if __name__ == "__main__": 
    main() 

Ich hatte gehofft, dass foo zuerst die aktuelle Zeit drucken wird. Dann kommt progress_bar zum Countdown für 10 Sekunden. Schließlich wird foo am Ende eine weitere Zeit ausgeben.

Tue Apr 5 11:49:47 2016 
100% =================================================>| 
Tue Apr 5 11:49:57 2016 

jedoch, was ich von dem Ausgang bekam etwas wie folgt aus:

Tue Apr 5 11:49:47 2016 
Tue Apr 5 11:49:57 2016 
100% =================================================>| 

Gibt es eine Möglichkeit, dies in Python zu beheben? Vielen Dank!

Antwort

1

Try this:

from multiprocessing import Process 
import time 

def foo1(thread): 
    print time.ctime() 
    time.sleep(10.5) 
    print time.ctime() 

def progress_bar(timer = 10): 
    digits = 4 
    delete = '\b' * 6 
    time_slot = float(timer)/100 
    for i in range(1, 101): 
     delete_bar = '\b' * 52 
     if i == 1: 
      bar = '|' + ' ' * 50 + '|' 
     else: 
      bar = '|' + '=' * (i/2 - 1) + '>' + ' ' * (50 - i/2) + '|' 
     print "{0}{1:{2}}{3}{4}".format(delete, str(i) + '%', digits, bar, delete_bar), 
     time.sleep(time_slot) 
    print '' 

def main(): 
    p1 = Process(target=foo1, args=('this',)) 
    # p1 = Process(target = foo1('this')) 
    p1.start() 
    time.sleep(0.1) 
    p2 = Process(target=progress_bar) 
    p2.start() 
    p1.join() 
    p2.join() 

if __name__ == "__main__": 
    main() 

Beachten Sie die verschiedenen p1-Prozess.

+1

Das ist was ich will! Vielen Dank! – yc2986

+0

Gern geschehen! – RiTu

1

Dies geschieht, weil die Funktionsparameter zuerst ausgewertet werden, und bei der Definition Ihrer p1 und p2 Sie anrufen tatsächlich foo1('this'), die bei der Definition von p1 die Funktion ausführt, und progress_bar() an der Instanziierung p2.

Für ein einfaches Beispiel, das dies demonstriert, siehe unten:

def fn(): 
    print 'called' 
    return 1 

target1 = fn() 
target = fn 

print target1 
print target 

Diese Drucke:

>>> called # Got called as soon as you called fn via fn() 
>>> 1 # Assigned the return value of fn to target1 
>>> <function fn at 0x12DA77F0> # Didn't get called, assigned the fn definition to target 

ich dein Beispiel bekam mit Thread s arbeiten unter (bearbeiten: Nachdem in einigen suchen Processexamples, es scheint, dass sie mit der gleichen Syntax wie der untenstehende Code arbeiten sollten (ändern Sie einfach den Import und verwenden Sie Process anstelle von Thread), aber aus irgendeinem Grund kann ich den Process Ansatz nicht drucken, auch nicht nach dem Kopieren des Beispiels. Könnte meiner benutzerdefinierte Python-Setup durch, aber nicht ganz sicher).

from threading import Thread 
import time 

def foo(thread): 
    print(time.ctime()) 
    time.sleep(10) 
    print(time.ctime()) 

def progress_bar(timer = 10): 
    digits = 4 
    delete = '\b' * 6 
    time_slot = float(timer)/100 
    for i in range(1, 101): 
     delete_bar = '\b' * 52 
     if i == 1: 
      bar = '|' + ' ' * 50 + '|' 
     else: 
      bar = '|' + '=' * (i/2 - 1) + '>' + ' ' * (50 - i/2) + '|' 
     print("{0}{1:{2}}{3}{4}".format(delete, str(i) + '%', digits, bar, delete_bar),) 
     time.sleep(time_slot) 
    print('') 

def main(): 
    t1 = Thread(target=foo, args=('this',)) # Notice, not foo('this') <- this executes foo('this') at definition 
    t1.start() 
    t2 = Thread(target=progress_bar) # Again, notice, no parens - target is just the function definition 
    t2.start() 
    t1.join() 
    t2.join() 

Dieser druckt

Tue Apr 05 15:09:34 2016 
('1% |             |',) 
('2% |>             |',) 
('3% |>             |',) 
('4% |=>            |',) 
('5% |=>            |',) 
('6% |==>            |',) 
('7% |==>            |',) 
('8% |===>            |',) 
('9% |===>            |',) 
('10% |====>            |',) 
('11% |====>            |',) 
('12% |=====>           |',) 
('13% |=====>           |',) 
('14% |======>           |',) 
('15% |======>           |',) 
('16% |=======>           |',) 
('17% |=======>           |',) 
('18% |========>           |',) 
('19% |========>           |',) 
('20% |=========>          |',) 
('21% |=========>          |',) 
('22% |==========>          |',) 
('23% |==========>          |',) 
('24% |===========>          |',) 
('25% |===========>          |',) 
('26% |============>          |',) 
('27% |============>          |',) 
('28% |=============>         |',) 
('29% |=============>         |',) 
('30% |==============>         |',) 
('31% |==============>         |',) 
('32% |===============>         |',) 
('33% |===============>         |',) 
('34% |================>         |',) 
('35% |================>         |',) 
('36% |=================>        |',) 
('37% |=================>        |',) 
('38% |==================>        |',) 
('39% |==================>        |',) 
('40% |===================>        |',) 
('41% |===================>        |',) 
('42% |====================>        |',) 
('43% |====================>        |',) 
('44% |=====================>       |',) 
('45% |=====================>       |',) 
('46% |======================>       |',) 
('47% |======================>       |',) 
('48% |=======================>       |',) 
('49% |=======================>       |',) 
('50% |========================>       |',) 
('51% |========================>       |',) 
('52% |=========================>      |',) 
('53% |=========================>      |',) 
('54% |==========================>      |',) 
('55% |==========================>      |',) 
('56% |===========================>      |',) 
('57% |===========================>      |',) 
('58% |============================>      |',) 
('59% |============================>      |',) 
('60% |=============================>     |',) 
('61% |=============================>     |',) 
('62% |==============================>     |',) 
('63% |==============================>     |',) 
('64% |===============================>     |',) 
('65% |===============================>     |',) 
('66% |================================>     |',) 
('67% |================================>     |',) 
('68% |=================================>    |',) 
('69% |=================================>    |',) 
('70% |==================================>    |',) 
('71% |==================================>    |',) 
('72% |===================================>    |',) 
('73% |===================================>    |',) 
('74% |====================================>    |',) 
('75% |====================================>    |',) 
('76% |=====================================>   |',) 
('77% |=====================================>   |',) 
('78% |======================================>   |',) 
('79% |======================================>   |',) 
('80% |=======================================>   |',) 
('81% |=======================================>   |',) 
('82% |========================================>   |',) 
('83% |========================================>   |',) 
('84% |=========================================>  |',) 
('85% |=========================================>  |',) 
('86% |==========================================>  |',) 
('87% |==========================================>  |',) 
('88% |===========================================>  |',) 
('89% |===========================================>  |',) 
('90% |============================================>  |',) 
('91% |============================================>  |',) 
('92% |=============================================> |',) 
('93% |=============================================> |',) 
('94% |==============================================> |',) 
('95% |==============================================> |',) 
('96% |===============================================> |',) 
('97% |===============================================> |',) 
('98% |================================================> |',) 
Tue Apr 05 15:09:44 2016 
('99% |================================================> |',) 
('100%|=================================================>|',) 
+0

Bei dem Versuch, das 'Process'-Beispiel erneut auszuführen, stürzte mein Computer ab -.- – Bahrom

+0

Es scheint, dass das Problem von der Prozesslinie (target = foo (1)) kommt. Ich kann das korrekte Ergebnis mit Process ausgeben (target = foo, args = ('this',)). Vielen Dank! – yc2986

+0

Das ist eigentlich noch nicht alles. *** Sie müssen die Klammern loswerden, wenn Sie auch den zweiten Prozess instanziieren. *** Bei ihnen entspricht Ihr Code nur 'p1.start()' und dann 'progress_bar()', das gerade läuft der Hauptprozess, macht den zweiten Prozess sinnlos. Sie können versuchen, einen dritten Prozess hinzuzufügen, um zu sehen, was ich meine. – Bahrom