0

例:

test.py

class test_class(object):
    def display(self):
        print "Hello"

lock1.py

from test import test_class
from time import sleep
obj = test_class()
while True:
    obj.display()
    sleep(1)

lock2.py

from test import test_class
obj = test_class()
# Raise error if instance of test_class has been implemented before
try:
   obj.display()
except Exception as e:
   print e

私がする必要があるのは、ファイルlock2.pyのクラス(またはtest.py全体)をロック(または何か)することです.Error(またはExpeption)を発生させる前にオブジェクトがそのクラスに対してすでに初期化されている場合 例は関連性がないように見えるかもしれませんが、例を単純化しました。

ファイル、つまりtest.pyを使用してロックしようとしました

http://packages.python.org/lockfile/lockfile.html

http://pypi.python.org/pypi/zc.lockfile

しかし、それは役に立たないようです。


これが実際のコードスニペットです

comm_port.py

import serial
class CommPort(object):
    def __init__(self):
        self.ser = serial.Serial("/dev/ttyUSB0")
        # update in db (I've removed actual db update process
        # db.flag = 1        

access_file1.py

from comm_port import CommPort
# if db.flag != 1:
    port = Commport()
    port.ser.flushInput()
    port.ser.flushOutput()
    ## will flush the buffer.. what if it flused the data that was supposed for go for accessing_file2
    port.ser.write("1")
    # do stuff using serial-port object "port"
    # lets say script gets busy for 30 secs for doing some stuffs
    # db.flag = 0

access_file2.py

from comm_port import CommPort
# if db.flag != 1:
    port = Commport()
    port.ser.flushInput()
    port.ser.flushOutput()
    port.ser.write("2")
    # do stuff using serial-port object "port"
    # lets say script gets busy for 40 secs for doing some stuffs
    # db.flag = 0

それでも例は関連性がないように見えるかもしれませんが、これは私の場合です。両方のファイルを一度にアクティブ化することもできますが、一度に操作する必要があるのは 1 つだけです。私がしたことは、comm_port.py が使用され、残りのファイルがこのフラグをチェックする場合に db フラグを作成することでした。comm_port がビジー状態の場合、他のアクセス ファイルは機能しません。しかし、私はそれがベストプラクティスだとは思いません。

したがって、CommPort クラスが任意のオブジェクトによって開始されているかどうか、または comm_port.py をロックするかどうかを確認する方法があるかどうかを確認する必要があります。または、他の既存のアイデアが大歓迎です。

4

2 に答える 2

1

この方法ではインポートが機能しないため、この状況にロックを適用することはできません。インポートされたモジュールは、最初にインポートされたときに一だけ実行されます。以降のインポートでは、既存の参照のみが からコピーされsys.modulesます。実際の問題が何であるかを把握し、代わりにそれについて尋ねる必要があります。

于 2012-10-15T06:23:20.280 に答える
0

インスタンスがすでに存在するかどうかを確認し、存在する場合はエラーを発生させることもできます。

In [1]: import gc

In [2]: class Foo(object):
   ...:     pass

In [3]: bar=Foo()

In [4]: [item for item in gc.get_referrers(Foo) if isinstance(item,Foo)]
Out[4]: [<__main__.Foo at 0x187cc90>]

useany([isinstance(item,Foo) for item in gc.get_referrers(Foo)])が True の場合、例外を発生させます。

于 2012-10-15T07:05:54.437 に答える