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

标签 python multithreading thread-safety pipe

考虑:

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/

相关文章:

python - NumPy 直方图 - ValueError 范围参数必须是有限的 - 输入数组没问题

java - 在线程中设置事件监听器

java - Java多线程如何让线程等待一段时间

swift - 在 Swift 中创建线程安全读取时,为什么在并发队列之外创建一个变量?

python - 如何将 Group By 系列转换为 Dataframe?

python - 循环遍历多个数据帧并创建日期时间索引,然后连接数据帧

java - 状态依赖和线程安全

java - ConcurrentHashMap 的线程安全

python - 以 "Secure"方式更新磁盘上的两个相关文件?

c++ - std::thread 不是全局变量,但在到达创建它的函数的末尾时不会超出范围?