我做了一个颜色。本地在下面的测试脚本中,查找颜色。本地被收垃圾了。但目前还不是很清楚。在第一个线程中实例化的TL.it
在第二个线程分配另一个值时被垃圾回收。
但我不知道是谁干的gc.收集()什么时候,与
绿色运行范围?我曾经发现TL.it
有时在mainloop greenlet中收集,有时是另一个greenlet,这会在我的程序中引起问题。例如,如果我这么做集线器开关()内部的优del_uu()方法,它将报告错误“Cannot switch to MAINLOOP from MAINLOOP”。在
import gc
import threading
from eventlet import hubs
from eventlet import event
import greenlet
import eventlet
eventlet.monkey_patch(all=True)
class InsideLocal(object):
def __init__(self, td):
self.td = td
def __del__(self):
print("Current greenlet inside %s: %s" %
(self.td, greenlet.getcurrent()))
print("Got deleted inside %s" % self.td)
class OutSideLocal(object):
def __init__(self, td):
self.td = td
def __del__(self):
print("Current greenlet outside %s: %s" %
(self.td, greenlet.getcurrent()))
print("Got deleted outside %s" % self.td)
TL = threading.local()
def play_insidethread(td, e):
global TL
TL.it = InsideLocal(td)
ot = OutSideLocal(td)
e.wait()
print("Quiting thread %s" % td)
print("====Starting first thread====")
e = event.Event()
gt = eventlet.spawn(play_insidethread, 'first', e)
print("Primary greenlet: %s" % hubs.get_hub().greenlet)
# try to trigger gc for objects inside corolocal.local
# but here failed.
print("====Stopping first thread====")
e.send()
eventlet.sleep(0)
print("====Deleting greenthread object====")
# failed again
del gt
eventlet.sleep(0)
# failed again.
print("====Doing gc manually====")
print("gc %s" % gc.collect())
eventlet.sleep(0)
print("====Multi thread test====")
# succeeded.
events = []
for i in range(3):
e = event.Event()
events.append(e)
eventlet.spawn(play_insidethread, i, e)
for e in events:
e.send()
eventlet.sleep(1)
print("====Quiting test====")
quit = event.Event()
quit.wait()
输出:
^{pr2}$编辑:
我读了this article,但没有得到答复。根据那篇文章中所说的,每次访问一个对象(create、delete、eg),python解释器将尝试执行一次垃圾收集,并在必要时从内存中删除一些对象。这不能解释我的测试结果,事实上线程.local()不在线程.local()表现不同。对象不在线程.local()在主循环运行时从未被删除,但中的对象线程.local()做。在
目前没有回答
相关问题 更多 >
编程相关推荐