问题描述
我正在编写以这种方式使用 Twisted 的代码:客户端建立一个永久的 Perspective broker TCP 连接(即,该连接在整个过程中保持打开状态,可能是几天、几个月或几年),并且在需要时使用此中断为不同的头像执行登录。
我的问题是代理的 Avatar 注销清理函数是 recorded,当代理 TCP 连接是 lost 时调用和删除。
我的问题是连接永远不会丢失,而且 broker.disconnects 列表越来越多。
更糟糕的是,我正在处理的代码中定义的头像注销函数在头像上有一个引用(通过闭包),而且头像可能很大,导致整个过程有问题的内存泄漏。
>这是从文档中改编的示例:
服务器:
#!/usr/bin/env python
# Inspired from pb6server.py here:
# https://twistedmatrix.com/documents/current/core/howto/pb-cred.html#two-clients
# copyright (c) Twisted Matrix Laboratories.
# See LICENSE for details.
from zope.interface import implementer
from twisted.spread import pb
from twisted.cred import checkers,portal
from twisted.internet import reactor
PROTOCOL = None
# I didn't find another way to get a reference to the broker: suggestion
# welcome!
class MyFactory(pb.PBServerFactory):
def buildProtocol(self,addr):
global PROTOCOL
PROTOCOL = super().buildProtocol(addr)
return PROTOCOL
class MyPerspective(pb.Avatar):
def __init__(self,name):
self.name = name
def perspective_foo(self,arg):
assert PROTOCOL is not None
print(f"Leaked avatars: {len(PROTOCOL.disconnects)}")
@implementer(portal.IRealm)
class MyRealm:
def requestAvatar(self,avatarId,mind,*interfaces):
if pb.IPerspective not in interfaces:
raise NotImplementedError
return pb.IPerspective,MyPerspective(avatarId),lambda: None
p = portal.Portal(MyRealm())
c = checkers.InMemoryUsernamePasswordDatabaseDontUse(
user0=b"pass0",user1=b"pass1",user2=b"pass2",user3=b"pass3",user4=b"pass4"
)
p.registerChecker(c)
factory = MyFactory(p)
reactor.listenTCP(8800,factory)
reactor.run()
和客户:
#!/usr/bin/env python
# Inspired from pb6client.py here:
# https://twistedmatrix.com/documents/current/core/howto/pb-cred.html#two-clients
from twisted.spread import pb
from twisted.internet import reactor
from twisted.cred import credentials
USERS_COUNT = 5
def main():
factory = pb.PBClientFactory()
reactor.connectTCP("localhost",8800,factory)
for k in range(10):
i = k % USERS_COUNT
def1 = factory.login(
credentials.UsernamePassword(f"user{i}".encode(),f"pass{i}".encode())
)
def1.addCallback(connected)
reactor.run()
def connected(perspective):
print("got perspective1 ref:",perspective)
print("asking it to foo(13)")
perspective.callRemote("foo",13)
main()
如何在不关闭代理 TCP 连接的情况下通知 broker
应该清理头像?
谢谢!
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)