Python 自旋锁,直到实例从Openstack获取其ip地址

Python 自旋锁,直到实例从Openstack获取其ip地址,python,novaclient,Python,Novaclient,我正在写一个程序,在需要时自动在openstack中创建服务器。问题是,我希望程序等待实例获得其ip地址后再继续。如果实例尚未获得其ip,novaclient将抛出异常,对象将死亡。使用sleep函数可以让它工作,但我不希望它成为永久的解决方案 ipAddress = None try: instance = nova.servers.create(name=self.hostName, image=image,

我正在写一个程序,在需要时自动在openstack中创建服务器。问题是,我希望程序等待实例获得其ip地址后再继续。如果实例尚未获得其ip,novaclient将抛出异常,对象将死亡。使用sleep函数可以让它工作,但我不希望它成为永久的解决方案

   ipAddress = None
   try:
        instance = nova.servers.create(name=self.hostName, image=image,
                                flavor=flavor, key_name="mykey",
                                nics=nics)
        while(ipAddress == None): #<---Something like this, just actually working
            for network in instance.networks['my_net']:
                if re.match('\d+\.\d+\.\d+\.\d+', network):
                    self.ipAddress = network
                    break

        print 'The server is waiting at IP address {0}.'.format(self.ipAddress)

    except:
        print "could not create webserver"
        #WebManager.exception(hostname)

    finally:
        print("Execution Completed")
        self.addToLoadbalancer()
ipAddress=None
尝试:
instance=nova.servers.create(name=self.hostName,image=image,
flavor=flavor,key\u name=“mykey”,
NIC=NIC)

而(ipAddress==None):#我设法解决了这个问题。事实证明,仅使用novaclient很难检测机器何时准备就绪。通过使用
nova list
我设法获得了ip地址

while 1 == 1:
    result = getbash("nova list" + " | grep " + hostname + \\
             " | awk '{print $12}'").split('=')
    if re.match('\d+\.\d+\.\d+\.\d+', result[-1]):
        self.ipAddress = result[-1]
        print 'The server is waiting at IP address {0}.'.format(self.ipAddress)
        break
    sleep(1)

这段代码查询主机名并检查实例是否接收到ip地址。getbash()函数是一个简单的
subprocess
函数,它返回
subprocess.Popen的输出(command,stdout=subprocess.PIPE,shell=True)

您已经编写的是一个自旋锁。它以尽可能快的速度旋转,反复检查,直到状态为真。这是一个坏主意,因为同样的原因,旋转锁在用户代码中通常是个坏主意,并且/或者对于可能花费大量时间的等待来说是个坏主意。使用
sleep
制作微睡眠旋转锁(每100ms检查一次,而不是尽可能快,或者每次
sleep(0)
)是一种改进;我不知道你为什么不想这样。最后,这里的正确答案显然是让你的脚本以某种方式得到通知。但是,如果没有来自Openstack或操作系统的通知,并且您无法修复,那么您真的没有选择。我知道,但是这个自旋锁不起作用,因为程序将崩溃,因为实例没有“my_net”,因此在大约20秒之前没有ip。我不知道python是否可以忽略这样一个异常而继续。最后一件事:你几乎永远不想比较
,而spam==None:
。您的意思是当垃圾邮件为无时
(如果您希望除
None
之外的任何内容都可以接受),或者当垃圾邮件为非垃圾邮件时
(如果您只希望真实的内容可以接受)。你唯一一次使用
==None
是如果你构建了一个奇怪的类,这个类与
None
相当。