【发布时间】:2017-07-20 13:30:51
【问题描述】:
我正在尝试为单元测试创建一个 Redis 临时实例:
class RedisTemporaryInstance:
def __enter__(self):
self.process = subprocess.Popen(['redis-server', '--port', '6399'],
stdout=open(os.devnull, 'wb'),
stderr=subprocess.STDOUT)
return self
def __exit__(self, exc_type, exc_value, traceback):
subprocess.call(['redis-cli', '-p', '6399', 'shutdown'])
但是当我这样使用它时:
import redis
with RedisTemporaryInstance() as temp:
red = redis.Redis(port=6399)
print(red.ping())
我来了
ConnectionError: Error 111 connecting to localhost:6399. Connection refused.
但是当我添加一个小睡眠时
with RedisTemporaryInstance() as temp:
sleep(0.01)
red = redis.Redis(port=6399)
print(red.ping())
一切正常。所以显然服务器还没有准备好接受没有睡眠的连接。
我的问题是:有没有更好的方法来等待服务器准备好而不是添加任意睡眠持续时间?
【问题讨论】:
-
看看刚刚提出的副本。如果您使用 retry 包,您可以制作一个调用,该调用将继续尝试连接到 redis 服务器,以至少检查它是否“启动”,一旦启动,您就可以继续进行测试。
标签: python sockets server redis subprocess