python线程计时器在linux计算机上的行为不同

2024-06-28 20:40:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我编写了一些代码,用于使用python库threading.Timer定期运行某些函数。它使用一些外部类:

class MyClass:
    def __init__(self, session):
        self.session = session  # session is an external class instance

    def doPeriodically(self):

        self.session.open_spectrum(spectrum_file)  # open spectrum file using session

        t = threading.Timer(5, self.doPeriodically, [], {})  # set up a timer

    def startPeriodicJob(self):

        self.doPeriodically()

mc = MyClass(session)
mc.startPeriodicJob()

我用ubuntu13.10、python2.7.5+和Tkinter版本81008在我的笔记本电脑上运行我的扩展,一切都运行得很好。但是当我用Ubuntu12.04 LTS和Python2.7.3以及Tkinter修订版81008将相同的代码复制到桌面上时,代码总是会出错(见下文)。你知道吗

但请注意:我的代码是对sparky的扩展,其中包含python2.4.2。因此,代码应该由python2.4.2来解释。它也可以在下面的错误消息中看到。你知道吗

Exception in thread Thread-1:
Traceback (most recent call last):
  File "/usr/local/src/sparky/platforms/linux-2.6.9/python-2.4.2/lib/python2.4/threading.py", line 442, in __bootstrap
    self.run()
  File "/usr/local/src/sparky/platforms/linux-2.6.9/python-2.4.2/lib/python2.4/threading.py", line 605, in run
    self.function(*self.args, **self.kwargs)
  File "/path/to/my/own/code/MyClass.py", line 64, in doPeriodically
    self.session.do_jobs() 
Error: session 0 not found

我的计算机上不存在到Python2.4.2的路径。它是从预编译的二进制程序,我写的扩展。你知道吗

问题是,代码在一台计算机上运行得很好,但在另一台计算机上却不行。似乎是程序中附带的python2.4.2解释了我的扩展(我的班级.py),因此这两台计算机上的python版本不应该在这里起作用。你知道吗

有什么问题吗?不同的线程可以使用同一个会话实例来执行其成员函数吗?你知道吗

如果我将会话实例传递给函数:

class MyClass:
    def __init__(self, session):
        self.session = session  # session is an external class instance

    def doPeriodically(self, sess):

        sess.open_spectrum(spectrum_file)  # open spectrum file using session

        t = threading.Timer(5, self.doPeriodically, [sess,])  # set up a timer

    def startPeriodicJob(self):

        self.doPeriodically(self.session)

mc = MyClass(session)
mc.startPeriodicJob()

会话类可以在sparky包中找到: https://www.cgl.ucsf.edu/home/sparky/


Tags: 代码inselfsessiondefmyclassopenmc