gpt4 book ai didi

Python:os.read()/os.write() 在 os.pipe() 线程安全吗?

转载 作者:太空狗 更新时间:2023-10-29 21:41:19 53 4
gpt4 key购买 nike

考虑:

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(), ... 编写的字符串必须保持在一个片段中。

是否满足这些要求?

提前谢谢你,

简·菲利普·格尔克

最佳答案

os.pipe 返回的两个 fd 上的

os.reados.write 是线程安全的,但你似乎要求超过那。 Sub (1),是的,单次读取或写入没有“原子性”保证——您描述的场景(一次短写入最终产生两次读取)是完全可能的。 (一般来说,os.whatever 是操作系统功能的一个薄包装,由操作系统来确保或不能确保您需要的功能类型;在这种情况下,Posix 标准不需要操作系统以确保这种“原子性”)。您可以保证以正确的顺序获取所有写入的数据,仅此而已。一旦大块数据填满操作系统提供的缓冲区,单次写入可能会停止,并且只有在其他线程读取了一些初始数据(当然要小心死锁!)等情况下才会继续。

Sub (2),是的,日志记录模块是线程安全的,并且在单次调用 logging.info、logging.warn、logging.error 等生成的数据中是“原子的”,“在对底层处理程序的调用方面保持一体”(但是,如果该处理程序反过来使用非原子方式,例如 os.write,它可能仍然会在内核中停顿,直到底层缓冲区畅通无阻,等等,等等,如上)。

关于Python:os.read()/os.write() 在 os.pipe() 线程安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1185660/

53 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com