2016-04-05 7 views
1

У меня есть функция индикатора выполнения. Я хотел бы запустить этот индикатор выполнения, пока другая функция выполняет обработку. Я написал простой тестовый код с использованием многопроцессорного модуля, и он не работал хорошо. Мой код:Python многопроцессорный выход

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

Я надеялся, что foo напечатает текущее время в первую очередь. Затем progress_bar приходит к обратному отсчету в течение 10 секунд. Наконец, foo выведет другое время в конце.

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

Однако то, что я получил от выхода что-то вроде этого:

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

Есть ли способ исправить это в Python? Большое спасибо!

ответ

1

Попробуйте это:

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

Обратите внимание на разные p1 процесса.

+1

Это то, что я хочу! Большое спасибо! – yc2986

+0

Добро пожаловать! – RiTu

1

Это происходит потому, что параметры функции вычисляются в первую очередь, и при определении вашей p1 и p2 вы на самом деле вызова foo1('this'), который выполняет функцию при определении p1 и progress_bar() в конкретизации p2.

Для простого примера, который демонстрирует это, смотрите ниже:

def fn(): 
    print 'called' 
    return 1 

target1 = fn() 
target = fn 

print target1 
print target 

Это печатает:

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

Я получил ваш пример работы с Thread с ниже (Edit: После просмотра в некоторых , кажется, что они должны работать с тем же синтаксисом, что и приведенный ниже код (просто измените импорт и используйте Process вместо Thread), но по какой-то причине я просто не могу получить подход Process к печати даже после копирования примера. Может быть из-за моей установки пользовательских питона, но не совсем уверен).

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

Печатается

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

попытка повторного запуска примера «Процесс» снова разбила мой компьютер. - – Bahrom

+0

Кажется, проблема связана с вызывающей линией Process (target = foo (1)). Я могу вывести правильный результат с помощью Process (target = foo, args = ('this',)). Большое спасибо! – yc2986

+0

Это еще не все. *** Вам нужно избавиться от круглой скобки при создании экземпляра второго процесса. *** С их помощью ваш код эквивалентен просто «p1.start()», а затем «progress_bar()», который запускается только основной процесс, делая второй процесс бессмысленным. Вы можете попробовать добавить третий процесс, чтобы понять, что я имею в виду. – Bahrom