Python Threading 多线程之 print
在实例中,发现一个关于print的问题,尚未得到答案,记录下来,等待答案揭晓的一天
代码1实例代码:
# coding:utf-8
import threading
import time
def action(arg):
time.sleep(1)
print '[sub thread name] {}\r'.format(threading.currentThread().getName())
print '[arg] {}\r'.format(arg)
for i in xrange(4):
t = threading.Thread(target=action, args=(i,))
t.start()
print 'main_thread end!'
代码逻辑:循环四次调用aciton方法。期待的结果是
1. 优先打印结束标志‘main_thread end’
2. sleep1秒后,分别打印4次action的执行信息(arg = 0-4)
实际标志性结果输出:
结果编号 | 输出图 | 注释 |
结果1 | ![]() | 与预期一致 |
结果2 | ![]() | 少数出了一组信息 |
结果3 | ![]() | 少输出了半组信息 |
少数情况下输出结果1与预期一致。多数情况下的输出结果与预期相比都是缺少打印数据的。
根据以上结果,似乎很自然可以猜想到“print”操作是非线程安全的。
但是稍稍修改print打印信息之后(去掉\r)
代码2实例代码:
# coding:utf-8
import threading
import time
def action(arg):
time.sleep(1)
print '[sub thread name] {}'.format(threading.currentThread().getName())
print '[arg] {}'.format(arg)
for i in xrange(4):
t = threading.Thread(target=action, args=(i,))
t.start()
print 'main_thread end!'
多次运行,代码输出结果均与预期一致,没有少输出任何信息。结合代码1的猜想:“根据以上结果,似乎很自然可以猜想到“print”操作是非线程安全的。”,进一步总结:打印信息中包含转义字符"\r"的print语句是非线程安全的。
进一步,是不是只要打印信息中包含转义字符,就有问题呢
修改代码:将\r替换成\n,\t
# coding:utf-8
import threading
import time
def action(arg):
time.sleep(1)
print '[sub thread name] {}\t'.format(threading.currentThread().getName())
print '[arg] {}\n'.format(arg)
for i in xrange(4):
t = threading.Thread(target=action, args=(i,))
t.start()
print 'main_thread end!'
发现打印结果没有缺失,似乎只有在\r的情况下会出现打印缺失的问题
暂定一个猜想结论:打印信息中包含转义字符"\r"的print语句是非线程安全的。