[英]Python: is os.read() / os.write() on an os.pipe() threadsafe?
考虑:
pipe_read, pipe_write = os.pipe()
现在,我想知道两件事:
(1)我有两个主题。 如果我保证只有一个正在读取os.read(pipe_read,n)
而另一个只是编写os.write(pipe_write)
,那么即使两个线程同时执行它,我也会遇到任何问题吗? 我会获得以正确顺序写入的所有数据吗? 如果他们同时这样做会发生什么? 是否有可能单个读取片段,例如?:
Thread 1: os.write(pipe_write, '1234567')
Thread 2: os.read(pipe_read,big_number) --> '123'
Thread 2: os.read(pipe_read,big_number) --> '4567'
或者 - 再次考虑同时性 - 单个os.write(some_string)
总是完全由单个os.read(pipe_read, very_big_number)
?
(2)使用logging.handlers.FileHandler()
)考虑多个线程写入管道的pipe_write
端 - 我已经读过日志记录模块是线程安全的。 这是否意味着我可以做到这一点而不会丢失数据? 我想我将无法控制管道中数据的顺序; 但这不是必需的。 要求:
logger.info(), logger.error(), ...
编写的字符串必须保持一个整体。 这些要求是否得到满足?
先感谢您,
Jan-Philip Gehrcke
从os.pipe
返回的两个fds上的os.read
和os.write
是线程安全的,但你似乎要求更多。 Sub (1)
,是的,对于sinle读取或写入没有“原子性”保证 - 您描述的场景(单个短写入最终产生两个读取)是完全可能的。 (一般来说,os.whatever是操作系统功能的薄包装,并且由操作系统来确保或无法确保您需要的功能;在这种情况下,Posix标准不需要操作系统确保这种“原子性”)。 您可以保证获得所有已写入的数据,并且顺序正确,但就是这样。 一旦填充了OS提供的缓冲区,一次写入大量数据就会停止,只有在其他一些线程读取了一些初始数据时才会停止(当然要注意死锁!)等等。
Sub (2)
,是的,日志记录模块是线程安全的和“原子的”,因为通过对logging.info,logging.warn,logging.error等的单次调用产生的数据,就调用而言“保持一个整体”。底层处理程序(但是如果该处理程序依次使用非原子方式,如os.write,它可能仍会在内核中停顿,直到底层缓冲区被取消,等等,如上所述)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.