【发布时间】:2009-07-26 21:53:25
【问题描述】:
考虑:
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(), ...编写的字符串必须保持为一体。
这些要求都满足了吗?
提前谢谢你,
简-菲利普·格尔克
【问题讨论】:
-
顺便说一句:我知道
Queue.Queue()和select.select()。在我的特殊情况下,从线程 A 到线程 B 的通信将通过Queue.Queue():它传输“命令”。相比之下,B->A 会传输日志消息,应该如上所述通过os.pipe()来实现,因为线程A 已经实现了基于select.select()的事件循环,它可以监控pipe_read,如果出现则调用回调函数有一些可读的东西。
标签: python multithreading thread-safety pipe