我有一个python脚本,其中有一个全局变量object_list
我开始5个并行线程,调用一个函数从SQS中读取objects
并追加到同一列表中。如下所示:-
object_list = []
def operate(obj_array):
for obj in obj_array:
# some calculation.
# obj is of type dict.
obj.clear()
# either i can clear each object in the for loop or delete the obj_array at the end.
del obj_array
def append_to_list(sqs):
global object_list
object_list.append(sqs)
if len(object_list) > 100:
o = Thread(target=operate, args=(object_list,))
o.start()
object_list = []
def object_reader(process_number):
print process_number
for msg in queue.get_messages():
obj = json.loads(msg.get_body())
t = Thread(target=append_to_list, args=(obj,))
t.start()
for x in xrange(5):
t = Thread(target=object_reader, args=(x,))
t.start()
如上面的代码所示,我希望程序启动5个线程以从SQS中读取并将对象附加到一个全局列表中。
一旦列表长度超过100,我想在另一个线程中对该列表进行操作,并且还要使全局列表为空以重复相同的内容。
问题是我的程序以无限循环(24x7)运行,但是脚本内存不断增加并超过了容器限制,这导致容器被杀死。
我不知道为什么内存超过100时会不断增加,因为我要清空全局列表。
答案 0 :(得分:0)
您可能对名称为object_list
的对象有悬空的引用,因此该对象永远不会被垃圾回收。
执行object_list = []
会将新的空列表分配给全局名称object_list
,但不会修改该名称所指向的现有列表对象(可能是悬挂的)。
您可能想使用分片分配就地清除整个列表:
object_list[:] = []