MyCron
クラスとクラスで構成される python3 cron スクリプトがありMyIMAP
ます。
このMyCron
クラスは、スクリプトのインスタンスが 1 つだけ実行されるようにする抽象クラスです。ロック ファイルを作成および破棄し、SingleInstanceExeption
既に実行中のスクリプトを cron が実行しようとすると をスローします。
クラスは、クラスをその基本クラスとしてMyIMAP
継承します。MyCron
電子メールをチェックし、未読の電子メールを返します。何か問題が発生した場合は、スクリプトで接続を適切に閉じてロックファイルを破棄する必要があります。
__del__
両方のクラスで、メソッドをオーバーライドしています。MyCron
ロックを解除する必要があるため、MyIMAP
接続を閉じる必要があります。
__del__
を呼び出すと、奇妙な結果 (オブジェクトが存在しなくなる)が発生します。コードのサンプルを次に示します。
class MyCron(object):
def __init__(self, jobname=os.path.basename(sys.argv[0]).split('.')[0]):
self.logger = logging.getLogger(__name__)
self.initialized = False
lockfilename = "mycron"
lockfilename += "-%s.lock" % jobname if jobname else ".lock"
self.lockfile = os.path.normpath(tempfile.gettempdir() + '/' + lockfilename)
self.logger.debug("MyCron lockfile: " + self.lockfile)
self.fp = open(self.lockfile, 'w')
self.fp.flush()
try:
fcntl.lockf(self.fp, fcntl.LOCK_EX | fcntl.LOCK_NB)
self.initialized = True
except IOError:
self.logger.warning("Another %s MyCron is already running, quitting." % jobname)
raise SingleInstanceException()
self.initialized = False
def __del__(self):
if not self.initialized:
return
try:
fcntl.lockf(self.fp, fcntl.LOCK_UN)
# os.close(self.fp)
if os.path.isfile(self.lockfile):
os.unlink(self.lockfile)
except Exception as e:
if self.logger:
self.logger.warning(e)
else:
print("Unloggable error: %s" % e)
sys.exit(-1)
class MyIMAP(MyCron):
def __init__(self, server, username, password, port=993, timeout=60):
super(MyIMAP, self).__init__()
self.server = server
self.username = username
self.password = password
self.port = port
self.connection = None
if self.initialized:
socket.setdefaulttimeout(timeout)
self.connect()
self.login()
def __del__(self):
super(MyIMAP, self).__del__()
if self.initialized and self.connection:
self.connection.logout()
self.logger.info("Close connection to %s:%d" % (self.server, self.port))
...
これはメソッドの予測不可能な性質に関連していることを理解しており、__del__
おそらくこれを別の方法で実装する必要があります。ここでのpython 3のベストプラクティスは何ですか?