Python 多处理输出

Python multiprocessing output

我有进度条功能。我想 运行 这个进度条,而另一个函数正在处理。我已经使用多处理模块编写了一个简单的测试代码,但效果不佳。我的代码:

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有没有办法解决这个问题? 非常感谢!

发生这种情况是因为首先评估函数参数,并且在定义 p1p2 时,您实际上是在调用 foo1('this'),它在 [ 的定义处执行函数=14=],和 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

我让你的例子与下面的 Threads 一起工作(编辑:在调查了一些 Process examples 之后,他们似乎应该使用与以下代码相同的语法(只需更改导入并使用 Process 而不是 Thread),但由于某种原因我无法使用 Process 方法进行打印, 即使在复制示例之后。可能是由于我的自定义 python 设置,但不完全确定。):

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%|=================================================>|',)

试试这个:

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 进程。