2016-04-05 28 views
1

Bir ilerleme çubuğu işlevim var. Diğer işlev işlem yaparken bu ilerleme çubuğunu çalıştırmak istiyorum. Çok işlemcili bir modül kullanarak basit bir test kodu yazdım ve iyi çalışmıyordu. Benim kodum:Python çoklu işlem çıktısı

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() 

Bu foo'nun o anki zamanı önce basacağını umuyordum. Ardından progress_bar, 10 saniye geri sayıma gelir. Sonunda foo sonunda başka bir zaman çıkarır.

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

Python Bunu düzeltmek için bir yol var mı:

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

Ancak böyle bir şey ne çıkışından var mı? Çok teşekkür ederim!

cevap

1

bu deneyin yazdırır:

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() 

Bildirim farklı p1 Süreci.

+1

İstediğim şey bu! Çok teşekkür ederim! – yc2986

+0

Rica ederim! – RiTu

1

Bu fonksiyon parametreleri ilk olarak değerlendirilir çünkü oluyor, ve p1 tanımlanması ve p2 aslında p2 nesnelleştirilmesi en p1 tanımlamadaki işlevini yürütür foo1('this') ve progress_bar() çağırıyorlar zaman almaktadır.

bu gösteren basit Örneğin

aşağıya bakın:

def fn(): 
    print 'called' 
    return 1 

target1 = fn() 
target = fn 

print target1 
print target 

Bu baskılar:

>>> 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 
I ( Edit altında Thread s ile çalışmasını örnek var

: Bazı inceledikten sonra Processexamples, aşağıdaki kodla aynı sözdizimi ile çalışacak gibi görünüyorlar (yalnızca içe aktarmayı değiştir veyerine Process kullan), ancak bazı nedenlerden dolayı, örneği kopyaladıktan sonra bile Process yazdırma yöntemini alamıyorum. Benim özel piton düzenlemesi nedeniyle, ancak tamamen emin olabilir).

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() 

Bu

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

'Process' örneğini yeniden çalıştırmaya çalışırken bilgisayarım yeniden düştü. – Bahrom

+0

Sorun, Process (target = foo (1)) çağrısından geliyor. Doğru sonucu çıktı ile verebiliyorum (hedef = foo, args = ('this',)). Çok teşekkür ederim! – yc2986

+0

Bu aslında henüz her şey değil. *** İkinci işlemi de başlatırken parantezden kurtulmanız gerekir. *** Onlarla, kodunuz sadece p1.start() 've sonra 'progress_bar()' ifadesiyle eşdeğerdir. Ana süreç, ikinci süreci anlamsız kılıyor. Ne demek istediğimi görmek için üçüncü bir süreç eklemeyi deneyebilirsiniz. – Bahrom

İlgili konular