11

Python とツイスト フレームワークでチャット デーモンを作成しています。そして、複数のユーザーが接続されている場合に長期的にメモリを節約するために、関数で作成されたすべての変数を削除する必要があるのか​​ 、それともそれらの変数が自動的にクリアされるのか疑問に思っています. 私の要点を説明するために、私のコードのストリップダウンバージョンを次に示します。

class Chat(LineOnlyReceiver):

    LineOnlyReceiver.MAX_LENGTH = 500

    def lineReceived(self, data):

            self.sendMessage(data)

    def sendMessage(self, data):

            try:
                message = data.split(None,1)[1]
            except IndexError:
                return

            self.factory.sendAll(message)

            #QUESTION : do i have to delete message and date??????????????????

            del message
            del data


class ChatFactory(Factory):
    protocol = Chat

    def __init__(self):
        self.clients = []

    def addClient(self, newclient):
        self.clients.append(newclient)

    def delClient(self, client):
        self.clients.remove(client)

    def sendAll(self, message):
        for client in self.clients:
            client.transport.write(message + "\n")
4

3 に答える 3

16

C Python (参照実装) は、参照カウントとガベージ コレクションを使用します。オブジェクトへの参照の数が 0 に減少すると、自動的に回収されます。通常、ガベージ コレクションは、相互に参照するオブジェクト (またはそれらのオブジェクトからの他のオブジェクト) のみを再利用するため、参照カウントによって再利用することはできません。

したがって、ほとんどの場合、ローカル変数は関数の終了時に回収されます。これは、関数の終了時にオブジェクトがどこからも参照されなくなるためです。したがって、「del」ステートメントは完全に不要です.Pythonはとにかくそれを行うからです.

于 2009-09-25T15:52:17.397 に答える
7

Python オブジェクトが明示的に削除されることはありません。参照されていない Python オブジェクトから実際にメモリを再利用する唯一の方法は、ガベージ コレクターを使用することです。このdelキーワードは単に名前をオブジェクトからアンバインドしますが、オブジェクトは依然としてガベージ コレクションが必要です。

本当にそうしなければならない場合は、gcモジュールを使用してガベージ コレクターを強制的に実行することができますが、これはほぼ確実に時期尚早の最適化であり、ガベージ コレクションを不適切なタイミングで実行したり、非効率的に行ったりする可能性が非常に高くなりますしている。

上記のように使用delしても実際の効果はありません。これらの名前はスコープ外になったときに削除されるためです。確かに(r)するには、明示的なガベージコレクションをフォローアップする必要があります。

于 2009-09-25T15:44:19.140 に答える
4

Python はガベージ コレクションを使用します。これは、メモリが使用されなくなると自動的に解放されるため、メモリを気にする必要がないことを意味します。

于 2009-09-25T15:28:37.493 に答える