微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

扭曲:使用 uniq Perspective Broker TCP 连接多次登录

如何解决扭曲:使用 uniq Perspective Broker TCP 连接多次登录

我正在编写以这种方式使用 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 举报,一经查实,本站将立刻删除。