我基于a Python issue - closed/fixed编写了这个小测试类,它似乎出现在Fedora15上的Python2.7.1中。在
from subprocess import Popen, PIPE
from threading import Thread
OUTPUT = "asl;dkfhqwiouethnjzxvnhsldfhuyasdhofuiweqamchuisemfawepfhuaipwemhfuaehfclkuehnflw ehfcoiuwehfiuwmhefuiwehfoiuhSfcl hfulh fuiqhuif huiwafh uiahf iUH fhh flkJH fl HASLFuhSAIULFhSUA HFulSAHfOI SUFChiuwqhncriouweycriuowanbyoUIWCryu iWyruawyrouiWYRcoiu YCRoiuNr uyr oUIAWryocIUWRNyc owuroiuNr cuWyrnawueitcnoy U IuiR yiuowaYnorc oWIUAr coiury iuoAW rnuoi asdfsdfd\n"
class X(Thread):
def __init__(self):
Thread.__init__(self)
def run(self):
print("Running")
for i in xrange(10):
s = Popen(
"cat /tmp/junk",
shell=True,
stdout=PIPE,
universal_newlines=True
)
output = s.communicate()[0]
if not output == OUTPUT:
print("Error: %r" % output)
XThreads = set([])
for i in xrange(1000):
XThreads.add(X())
for x in XThreads:
x.start()
只需创建一个文件,在本例中是/tmp/junk,它的内容是OUTPUT
,减去最后一行换行。在
运行这个,你会看到“运行”在每一行。但是,有时它会显示“Running”或“RunningRunning\n\nRunning”。在
(删除了对实际问题的引用,因为这是一个错误的症状,多亏了@phihag的回答)。在
实际问题:https://stackoverflow.com/questions/9338409/python-subprocess-popen-corrupts-binary-streams
您看到的行为与子流程无关;我可以用以下方式重现:
这是因为Python's ^{} is not thread-safe 。为了避免打印文本和换行符之间的争用情况,请直接写入stdout,如下所示:
^{pr2}$这假设对stdout的底层
write
调用是线程安全的。That depends on the platform。在相关问题 更多 >
编程相关推荐