如何同时运行两个功能

chr*_*ley 15 python testing multithreading synchronization function

我正在运行测试,但我想同时运行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')
Run Code Online (Sandbox Code Playgroud)

我现在尝试了如下所述的线程模块.该线程不与TestAbsoluteMove.Ssh()函数同步运行.我还需要其他任何代码才能完成这项工作.

我已经看过将参数放入线程语句中,该语句表明线程在Ssh()函数运行时运行.有谁知道在这个声明中输入什么?

对不起,如果我没有正确解释."SudsMove"功能可将摄像机和"Ssh"功能日志移动到摄像机中,并检查摄像机当前所处的速度.问题是,当"Ssh"功能登录相机时已停止.我需要两个函数并行运行,所以我可以在它仍在移动时检查相机速度.

谢谢

And*_*Dog 12

导入threading模块并SudsMove()像这样运行:

threading.Thread(target = SudsMove).start()
Run Code Online (Sandbox Code Playgroud)

这将创建并启动一个后台线程来完成移动.

对编辑问题的回答:

据我了解,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
Run Code Online (Sandbox Code Playgroud)

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


Eri*_*got 5

如果您想使用通用的Python实现(CPython),则可以肯定使用了multiprocessing模块,它确实产生了奇迹(您可以将不可修改的参数传递给子进程,杀死任务等),提供的接口类似于线程,并且不受全局翻译锁定的影响。

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