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

Jan*_*cke 7 python multithreading pipe thread-safety

考虑:

pipe_read, pipe_write = os.pipe()
Run Code Online (Sandbox Code Playgroud)

现在,我想知道两件事:

(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'
Run Code Online (Sandbox Code Playgroud)

或者 - 再次考虑同时性 - 单个os.write(some_string)总是会完全由单个返回os.read(pipe_read, very_big_number)吗?

(2)考虑使用多个线程写入pipe_write管道的末尾logging.handlers.FileHandler()- 我已经读过记录模块是线程安全的.这是否意味着我可以做到这一点而不会丢失数据?我想我将无法控制管道中数据的顺序; 但这不是必需的.要求:

  • 写端的某些线程写入的所有数据必须在读端结束
  • 一个人写的字符串logger.info(), logger.error(), ...必须保持一个整体.

这些要求是否得到满足?

先感谢您,

Jan-Philip Gehrcke

Ale*_*lli 8

os.reados.write在两个FDS返回从os.pipe是线程安全的,但你似乎需要不止于此.Sub (1),是的,对于sinle读取或写入没有"原子性"保证 - 您描述的场景(单个短写入最终产生两个读取)是完全可能的.(一般来说,os.whatever是操作系统功能的薄包装,并且由操作系统来确保或不能确保您需要的功能;在这种情况下,Posix标准不需要操作系统确保这种"原子性").您可以保证获得所有已写入的数据,并且顺序正确,但就是这样.一旦填充了OS提供的缓冲区,一次写入一大段数据就会停止,只有在其他一些线程读取了一些初始数据时才会停止(当然要注意死锁!)等等.

Sub (2),是的,日志记录模块是线程安全的和"原子的",通过对logging.info,logging.warn,logging.error等的单次调用产生的数据,就调用底层处理程序而言"保持一个整体" (但是,如果该处理程序依次使用非原子方式,如os.write,它可能仍会在内核中停顿,直到底层缓冲区被取消,等等,如上所述).