在一个线程中从另一个线程向字节数组添加内容的同时部分删除元素
我有一个字节数组对象,有两个线程在访问它,一个是生产者,另一个是消费者。
生产者往字节数组里写数据:barr.extend(data)
消费者从字节数组里读取数据:barr.find(...)
和 barr[x:y]
生产者会往字节数组里添加很多数据,所以我想偶尔通过 del barr[:last_read_pos]
来释放一些内存。
这个操作在多线程环境下安全吗?
谢谢。
1 个回答
2
“这个操作是线程安全的吗?”
“是的,但这只是因为有个叫做全局解释器锁(GIL)的东西。实际上,这个操作并不安全,虽然它能工作,但最好不要这样做。直接使用一个锁就行了,这样做很简单。”
“或者,你可以使用队列,这个东西就是为这种情况设计的:把字节对象作为队列的项目添加,而不是扩展字节数组。这样可以让你的代码更简单、更高效,因为扩展字节数组会涉及到复制字节,有时候还需要重新分配整个数组等等。”
“所以,仔细看看你在评论中提到的需求:既然你想要一个连续的字节结构,一个简单的方法就是在生产者那边使用队列来发布字节对象,然后在消费者那边组装你的连续缓冲区。”