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有没有办法解决这个问题?
非常感谢!
发生这种情况是因为首先评估函数参数,并且在定义 p1
和 p2
时,您实际上是在调用 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
我让你的例子与下面的 Thread
s 一起工作(编辑:在调查了一些 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 进程。
我有进度条功能。我想 运行 这个进度条,而另一个函数正在处理。我已经使用多处理模块编写了一个简单的测试代码,但效果不佳。我的代码:
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有没有办法解决这个问题? 非常感谢!
发生这种情况是因为首先评估函数参数,并且在定义 p1
和 p2
时,您实际上是在调用 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
我让你的例子与下面的 Thread
s 一起工作(编辑:在调查了一些 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 进程。