Python线程安全的抱怨
Python许多开源组件都没有清晰表明是否线程安全的,所以在使用的时候很容易出现奇怪的问题。所以用这些开源组件之前, 一定要了解这些组件是否是线程安全的,allocate新的对象开销是不是很大,是否有pool的实现。如果没有Pool实现并且不是线程安全的话, 那么就需要加一个锁(mutex或者是读写锁)。
python logging模块里面的handler在实现上就是通过加锁来保证线程安全的。
def handle(self, record):
"""
Conditionally emit the specified logging record.
Emission depends on filters which may have been added to the handler.
Wrap the actual emission of the record with acquisition/release of
the I/O thread lock. Returns whether the filter passed the record for
emission.
"""
rv = self.filter(record)
if rv:
self.acquire()
try:
self.emit(record)
finally:
self.release()
return rv
然后最近看到一个handler支持向cloudwatch输出日志,它的实现方式就是可选地往一个memory queue里面写入日志,然后后台 有个worker在不断地将memory queue里面的日志输出到cloudwatch上。 watchtower
if self.use_queues:
if stream_name not in self.queues:
self.queues[stream_name] = queue.Queue()
thread = threading.Thread(target=self.batch_sender,
args=(self.queues[stream_name], stream_name, self.send_interval,
self.max_batch_size, self.max_batch_count))
self.threads.append(thread)
thread.daemon = True
thread.start()
if self.shutting_down:
warnings.warn("Received message after logging system shutdown", WatchtowerWarning)
else:
self.queues[stream_name].put(cwl_message)
else:
self._submit_batch([cwl_message], stream_name)
另外python里面居然还没有read/write lock实现!难以置信。