3
import socket
import sys
import binascii
import datetime
import time

try:
    port = 2122
    host = ''

except IndexError:
    print ("Error: ")
    print ("Be sure to specify username, password, port, database name and table name.\n")
    print ("Syntax: ./script.py username password port db_name table_name.")
    print ("Example: ./script.py hank mypass 8762 testdb test_table")
    print ("\nExit...")
    sys.exit(1)

while 1:
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    s.bind((host, port))
    s.listen(5)
    c, addr = s.accept()
    print ('Connected by', addr)
    data = c.recv(1042)
    s=binascii.hexlify(data)
    print(s)
    data = None
    c.close() 
    time.sleep(1)   
print('Exited!')

上記は、クライアント側をリッスンし続け、クライアント側がデータを送信して印刷するのを待つための無限ループでの私のコーディングです。それで全部です。この書き込み方法はメモリフラッドを引き起こすかどうか?ソケットを開き続け、無限ループで閉じるためです!.

P/S: ソケットをバインドしてリッスンし、.recv でのみループしようとしましたが、機能しません。データを一度しか受信できません。

4

1 に答える 1

1

「メモリフラッディング」が「メモリリーク」を意味する場合、いいえ、ここではメモリリークはありません。

ループを通過するたびに、との両方を再割り当てするsc、以前の値への他の参照がなくなるため、ガベージコレクションが行われます。CPythonでは、これはすぐに発生するはずです。他の実装(PyPy、Jython、IronPython)では、予測できない時点で発生します。

ただし、ファイルハンドルに問題がある可能性があります。その「予測不可能なポイント」は、メモリをクリーンアップする必要性によって引き起こされます。メモリよりも積極的にクリーンアップする必要のある他のリソースがある場合、GCに依存してクリーンアップすることはできません。そして、ソケット(ファイルハンドル)はまさにそのような種類のリソースです。500KBのメモリしか使用していないため、GCが触れていない25000個のソケットを未使用のままにしておく必要はありません。

c.close()ループを介して毎回明示的に呼び出しています。についても同じことを行う必要がありますs。または、with:ブロックを使用することをお勧めします。

そうは言っても、これは非常に奇妙なデザインです。メモリをリークしないからといって、それが実際にやりたいことであるとは限りません。

于 2013-01-14T22:39:10.443 に答える