繁体   English   中英

Python:在os.pipe()threadsafe上是os.read()/ os.write()吗?

[英]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.reados.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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM