子流程.Popen不是线程安全的?

2024-10-06 07:11:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我基于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


Tags: infromimportselfforoutputinitdef
1条回答
网友
1楼 · 发布于 2024-10-06 07:11:58

您看到的行为与子流程无关;我可以用以下方式重现:

import threading
def run(): print("Running")
for x in [threading.Thread(target=run) for i in range(1000)]:
    x.start()

这是因为Python's ^{} is not thread-safe。为了避免打印文本和换行符之间的争用情况,请直接写入stdout,如下所示:

^{pr2}$

这假设对stdout的底层write调用是线程安全的。That depends on the platform。在

相关问题 更多 >