是python';什么是同步打印?

是python';什么是同步打印?,python,printing,Python,Printing,python的打印是否同步?:) 线程之间。Python的。(Bram Cohen的话,不是我的。)如果您从多个线程调用print,调度程序可能会突发奇想将输出交错。答案是否定的,线程可以相互中断。 但是,可以使用锁来避免这种情况 锁防止线程在全局事务上相互中断(特别是在这里的输出屏幕) 当一个线程想要使用全局对象加锁时,它首先检查锁是否被解锁,如果没有,它会等到它被解锁,然后锁定锁,用全局对象做它想做的事情,最后释放锁 但是,不要只使用标志变量和if检查来实现这一点,线程可以在if语句和锁定之

python的打印是否同步?:)


线程之间。

Python的。(Bram Cohen的话,不是我的。)

如果您从多个线程调用
print
,调度程序可能会突发奇想将输出交错。

答案是否定的,线程可以相互中断。 但是,可以使用锁来避免这种情况

锁防止线程在全局事务上相互中断(特别是在这里的输出屏幕) 当一个线程想要使用全局对象加锁时,它首先检查锁是否被解锁,如果没有,它会等到它被解锁,然后锁定锁,用全局对象做它想做的事情,最后释放锁

但是,不要只使用标志变量和if检查来实现这一点,线程可以在if语句和锁定之间切换。 如果我没记错的话,Python实现了一个锁类threading.lock


另外,请注意,如果没有正确使用锁,可能会遇到死锁或活锁。我现在没有太多的时间,所以我不能在这里解释所有这些,但你可以在谷歌上搜索更多信息,我也会检查一下我是否可以分享我去年大学课程的演示,他们在那里解释得很好。

这是一种变通方法。。。它不同步打印,但它是单片的,因此线程之间不会相互重叠

优点:不需要锁定,因此速度更快

缺点:

  • 它不同步,并且不能保证事件将按发生的顺序打印。作为一个副作用,如果出现异常,异常文本可能在最后几次打印出来之前开始。它们可能出现在异常文本或堆栈跟踪中间的某个地方。
  • 运行循环需要更多的时间和内存

打印是一种语句(在<3.0中)。在什么上同步?在java中同步?您希望它的同步程度如何?当然,在某个时刻,输出是序列化的。我想你期望一个print语句的全部输出都在一起。学习编程不是为了找到答案,而是要学会很好地框定问题,使答案本身可能非常明显。比这更糟糕的是,如果你从多个线程调用
print
,Python的IO层中的不同步缓冲会导致输出从其他线程打印多次。啊,这比我想象的还要糟糕。
import threading, time


class SomeThread(threading.Thread):
    def __init__(self, name):
        super().__init__()
        self.name = name
        ...

    def mono_print(self, *v):
        p = time.strftime("%Y-%m-%d %H:%M:%S") + ' ' + self.name
        for s in v:
            p += ' ' + str(s)
        print(p + '\n', end='', flush=True)

    def run(self):
        self.mono_print('thread is running.')

        ...

        self.mono_print('something', 'them something else')

        ...

        self.mono_print('processed')