关于服务器侦听器的Python问题

关于服务器侦听器的Python问题,python,plugins,multithreading,teamcity,sleep,Python,Plugins,Multithreading,Teamcity,Sleep,我为jetbrains工具teamcity编写了一个插件。它几乎只是一个服务器侦听器,侦听正在触发的构建,并输出一些文本文件,其中包含有关不同构建的信息,如触发它的原因、那里有多少更改等。完成后,我编写了一个python脚本,可以在服务器运行和启动构建时将信息输入teamcity。我希望能够在构建运行后获得该构建的工件,但问题是我不知道每个构建运行需要多长时间。有时是30秒,有时是30分钟 因此,我用python中的这一行开始构建 urllib.urlopen('http://'+use

我为jetbrains工具teamcity编写了一个插件。它几乎只是一个服务器侦听器,侦听正在触发的构建,并输出一些文本文件,其中包含有关不同构建的信息,如触发它的原因、那里有多少更改等。完成后,我编写了一个python脚本,可以在服务器运行和启动构建时将信息输入teamcity。我希望能够在构建运行后获得该构建的工件,但问题是我不知道每个构建运行需要多长时间。有时是30秒,有时是30分钟

因此,我用python中的这一行开始构建

    urllib.urlopen('http://'+username+':'+password+'@localhost/httpAuth/action.html?add2Queue='+btid+'&system.name=<btid>&system.value=<'+btid+'>&system.name=<buildNumber>&system.value=<'+buildNumber+'>')
urllib.urlopen('http://'+username+':'+password+'@localhost/httpAuth/action.html?add2Queue='+btid+'&system.name=&system.value=&system.name=&system.value='))
在构建运行之后(一些不确定的时间),我想使用这一行来获取我的文本文件

urllib.urlopen('http://'+username+':'+password+'@localhost/httpAuth/action.html?add2Queue='+btid+'&system.name=<btid>&system.value=<'+btid+'>&system.name=<buildNumber>&system.value=<'+buildNumber+'>')
urllib.urlopen('http://'+username+':'+password+'@localhost/httpAuth/action.html?add2Queue='+btid+'&system.name=&system.value=&system.name=&system.value='))
同样的问题是,我不知道在执行第二行之前要等待多长时间。通常在Java中,我会执行第二个线程,它会休眠一段时间,等待构建完成。我不知道如何在python中实现这一点。因此,如果有人知道如何在python中实现这一点,或者有更好的方法实现这一点,我将不胜感激。如果我需要更好地解释自己,请让我知道

Grant-

Python实际上有一个与Java非常相似的函数,因此您应该能够轻松地使用它

但是如果你所需要做的就是等待预定的时间,那么使用

import time
time.sleep(300) # sleep for 300 seconds

除非您通过让构建服务器与您联系得到通知,否则唯一的方法就是轮询。您可以按照其他注释中的指示生成一个线程,您只需使用主脚本睡眠和轮询

比如:

wait=True
while wait:
   url=urllib.urlopen('http://'+username+':'+password+'@localhost/httpAuth/action.html?add2Queue='+btid+'&system.name=<btid>&system.value=<'+btid+'>&system.name=<buildNumber>&system.value=<'+buildNumber+'>')
   if url.getcode()!=404:
     wait=False
   else:
     time.sleep(60)
wait=True
等待时:
url=urllib.urlopen('http://'+username+':'+password+'@localhost/httpAuth/action.html?add2Queue='+btid+'&system.name=&system.value=&system.name=&system.value='))
如果url.getcode()=404:
等待=错误
其他:
时间。睡眠(60)
作为替代方案,您可以使用。然后,构建完成后,您可以让curl或wget连接到侦听的CherryPy服务器,并触发应用程序下载url


您也可以使用xmlrpclib执行类似的操作。

如果构建未完成,而您调用了第二部分,会发生什么情况?它将返回http 404错误。这与访问一个不存在的html页面是一样的,因为一旦构建完成,文本文件将只存在于服务器上的那个位置。这是我一直在想的,但我不知道需要多少时间。我最初的想法是在同一时间执行.sleep()命令,并尝试定位文件。如果它返回http 404错误,那么再休眠这么多秒,然后重试。这看起来像是一个丑陋的方法,我希望有一个更优雅的解决方案。哦,也谢谢你的链接,我现在正在阅读。)@cozmokramer8:这叫“投票”或“忙着等待”,这是你在这种情况下的唯一选择。我想那时我必须投票了。我喜欢你对备选方案的建议,但我有点受限,因为我必须只使用服务器上当前安装的内容。这是为一家相当大的公司准备的,我甚至没有选择安装额外的python LIB:(尽管如此,还是要感谢代码。奇怪的是,这样做会被认为是糟糕的编码实践吗?我觉得很难看,但显然这种情况必须经常发生。再次感谢Grant,中断驱动或基于轮询的通知是一个大问题。有时轮询更有效,有时事件通知更有效。我通常不喜欢轮询,但有时更大的体系结构决策会否定使用通知的可能性。在这种情况下,唯一的选择是轮询。关于轮询,通常最好使轮询间隔可配置b/c没有一个真正的轮询间隔。再次感谢Christopher you have是一个很大的帮助。也感谢关于使其可配置的提示,这是一个好主意。另外,如果将来有人在阅读本文以获取提示,我也会在尝试25分钟后到达循环将中断的位置。我这样做是因为有可能有人启动构建,然后中断它,所以文本文件永远不会出现然后,如果我运行这个脚本,它将处于一个连续循环中-