如何同时运行两个函数

2024-09-24 02:20:54 发布

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

我正在运行测试,但我想同时运行两个函数。我有一个摄像头,我告诉它通过suds移动,然后我通过SSH登录到摄像头,检查摄像头设置的速度。当我检查速度时,相机已经停止,所以没有速度可用。有没有办法让这些功能同时运行来测试相机的速度。示例代码如下:

class VerifyPan(TestAbsoluteMove):

    def runTest(self):

        self.dest.PanTilt._x=350

        # Runs soap move command
        threading.Thread(target = SudsMove).start()

        self.command = './ptzpanposition -c 0 -u degx10'

        # Logs into camera and checks speed
        TestAbsoluteMove.Ssh(self)

        # Position of the camera verified through Ssh (No decimal point added to the Ssh value)
        self.assertEqual(self.Value, '3500')

我现在已经尝试了下面提到的线程模块。线程不与函数TestAbsoluteMove.Ssh()同步运行。我还需要其他代码来实现这个功能吗。

我已经研究了将参数放入thread语句中,该语句在Ssh()函数运行时声明线程。有人知道在这个声明中要输入什么吗?

对不起,如果我没有正确解释。“SudsMove”函数移动相机,“Ssh”函数登录到相机并检查相机当前的移动速度。问题是,当“Ssh”函数登录到相机时,它已经停止。我需要两个功能并行运行,这样我可以检查相机的速度,而它仍然在移动。

谢谢


Tags: the函数代码self功能声明语句线程
3条回答

如果您想使用公共Python实现(CPython),您当然可以使用multiprocessing模块,该模块does wonders(您可以将不可pickle的参数传递给子进程,终止任务,…),提供类似于线程的接口,并且不受全局解释器锁的影响。

缺点是子进程是派生的,这比创建线程需要更多的时间;只有当您有许多短任务时,这才应该是一个问题。此外,由于数据是在进程之间(通过序列化)传递的,因此大数据的传递都需要很长时间,并且最终会占用很大的内存(因为它在每个进程之间都是重复的)。在每个任务花费“很长”时间并且每个任务进出的数据不太大的情况下,multiprocessing模块应该很棒。

只能有一个线程同时运行。这已经得到了广泛的回答。一个解决方案是使用两个独立的过程。上面的答案提供了一些提示。

导入threading模块并运行SudsMove(),如下所示:

threading.Thread(target = SudsMove).start()

它将创建并启动一个执行移动的后台线程。

编辑问题的答案:

据我所知,TestAbsoluteMove.Ssh(self)只轮询一次速度并将结果存储到self.Value?!你用self.assertEqual(self.Value, '3500')测试预期的末端倾斜/旋转/位置?!

如果这是正确的,你应该等待相机开始移动。您可能可以在特定的时间间隔内轮询速度:

# Move camera in background thread
threading.Thread(target = SudsMove).start()

# What does this do?
self.command = './ptzpanposition -c 0 -u degx10'

# Poll the current speed in an interval of 250 ms
import time
measuredSpeedsList = []

for i in xrange(20):
    # Assuming that this call will put the result in self.Value
    TestAbsoluteMove.Ssh(self)
    measuredSpeedsList.append(self.Value)
    time.sleep(0.25)

print "Measured movement speeds: ", measuredSpeedsList

移动速度将是measuredSpeedsList(即max(measuredSpeedsList))中的最大值。希望这有道理。。。

相关问题 更多 >