如何同时运行两个函数
Posted
技术标签:
【中文标题】如何同时运行两个函数【英文标题】:How to run two functions simultaneously 【发布时间】:2010-01-21 09:32:58 【问题描述】:我正在运行测试,但我想同时运行 2 个函数。我有一个摄像头,我告诉它通过 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() 同步运行。我还需要其他代码来完成这项工作吗?
我已经研究了将参数放入线程语句中,以表明线程在 Ssh() 函数时运行。有谁知道在这个语句中输入什么?
对不起,如果我没有正确解释。 “SudsMove”功能移动相机,“Ssh”功能登录相机并检查相机当前移动的速度。问题是当“Ssh”功能登录相机时已经停止。我需要两个函数并行运行,这样我就可以在相机仍在移动时检查它的速度。
谢谢
【问题讨论】:
您可以在移动相机时记录速度吗?也许到一个日志文件。你想达到什么目的?反正我觉得上面的测试没什么用。 编辑了我的答案以回答您的同步问题。 你看过我编辑的答案吗?有意义吗? 也许 ssh 需要很长时间才能打开连接 - 例如,相机可能会尝试进行 dns 查找。在这种情况下,您可能需要更改TestAbsoluteMove.Ssh
以使用已打开的连接。
Python: How can I run python functions in parallel?的可能重复
【参考方案1】:
导入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)
)。希望这是有道理的......
【讨论】:
【参考方案2】:如果你想使用通用的 Python 实现(CPython),你当然可以使用multiprocessing 模块,does wonders(你可以将不可腌制的参数传递给子进程,杀死任务,...),提供了一个接口类似于线程,不受全局解释器锁的影响。
缺点是会产生子进程,比创建线程需要更多时间;如果您有很多很多短期任务,这应该只是一个问题。此外,由于数据在进程之间传递(通过序列化),大数据既需要很长时间才能传递,最终会占用大量内存(因为它在每个进程之间重复)。在每个任务花费“较长”时间并且每个任务进出的数据不是太大的情况下,multiprocessing 模块应该很棒。
【讨论】:
【参考方案3】:只能有一个线程同时运行。这已经得到了广泛的回答here。一种解决方案是使用两个单独的过程。上面的答案提供了一些提示。
【讨论】:
【参考方案4】:如果您可以让您的代码在 Jython 或 IronPython 下运行,那么您可以同时运行多个线程;他们没有 CPython 那种愚蠢的“全局解释器锁”。
【讨论】:
以上是关于如何同时运行两个函数的主要内容,如果未能解决你的问题,请参考以下文章