我正在运行测试,但我想同时运行2个函数。我有一个摄像头,我告诉它通过肥皂水移动,我然后通过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()函数同步运行。是否还需要其他代码来完成这项工作。
我已经研究过将参数放入线程语句中,该语句声明线程在Ssh()函数运行时运行。有谁知道在这个声明中输入什么内容?
对不起,如果我没有正确解释。 “SudsMove”功能可将摄像机和“Ssh”功能日志移动到摄像机中,并检查摄像机当前所处的速度。问题是,当“Ssh”功能登录相机时已停止。我需要两个函数并行运行,所以我可以在它仍在移动时检查相机速度。
由于
答案 0 :(得分:12)
导入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)
)。希望有意义......
答案 1 :(得分:4)
如果你想使用常见的Python实现(CPython),你当然可以使用multiprocessing模块,does wonders(你可以将非pickleable参数传递给子进程,杀死任务,......) ,提供类似于线程的接口,并且不受全局解释器锁的影响。
缺点是产生子进程,这比创建线程需要更多时间;如果你有许多很短的任务,这应该只是一个问题。在每个任务需要“很长”时间的情况下,multiprocessing模块应该很棒。
答案 2 :(得分:2)
只能有一个线程同时运行。这已被广泛回答here。一种解决方案是使用两个单独的过程。以上答案提供了一些提示。
答案 3 :(得分:1)
如果您可以让代码在Jython或IronPython下运行,那么可以同时运行多个线程;他们没有那种愚蠢的“全球翻译锁定”CPython的东西。