gc如何在python中使用eventlet(greenlet)?

2024-04-25 03:31:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我做了一个颜色。本地在下面的测试脚本中,查找颜色。本地被收垃圾了。但目前还不是很清楚。在第一个线程中实例化的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()做。在


Tags: importselfeventlocaldefsleep线程greenlet