锁定类/文件以避免多次访问

时间:2012-10-15 06:13:55

标签: python pyserial

示例:

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) 在提出错误(或Expeption)之前。我已经简化了这个例子,尽管这个例子可能看起来并不相关。

我尝试使用

锁定文件,即test.py.
http://packages.python.org/lockfile/lockfile.html

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

但它似乎没有帮助。


这是一个实际代码SNIPPET

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        

accessing_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

accessing_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

这个例子看起来可能并不相关,但这是我的情况。 两个文件也可以立即激活,但我一次只需要一个。 如果使用comm_port.py并且其余文件检查此标志,我所做的就是创建了一个db标志。 如果comm_port忙,其他访问文件将无法正常工作。 但我不认为这是最好的做法。

所以我需要检查是否有办法检查CommPort类是否被任何对象或 通过锁定comm_port.py或任何其他现有的想法是最受欢迎的。

2 个答案:

答案 0 :(得分:1)

您无法对此情况应用锁定,因为导入不会以这种方式运行。导入的模块仅在第一次导入时执行一次。后续导入仅复制sys.modules的现有引用。你需要弄清楚你的实际问题是什么,然后再问一下。

答案 1 :(得分: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>]

使用any([isinstance(item,Foo) for item in gc.get_referrers(Foo)]),如果为True,则引发一个例外。