如何告诉python使用者等待客户端启动

Posted

技术标签:

【中文标题】如何告诉python使用者等待客户端启动【英文标题】:How to tell python consumer to wait for client to bootup 【发布时间】:2021-12-01 08:45:14 【问题描述】:

我在 docker 容器中有一个基本问题,当我尝试开始创建和启动两个图像时,第二个图像(python 和一些脚本)依赖于第一个图像。

这会导致第二张图片出错并停止。如何通过我的python脚本在客户端消费,等待客户端启动?

我认为这个问题不一定是 Apache Pulsar 问题,但这里有一些文档供感兴趣的人参考

Apache Pulsar standalone

python api docs

客户端上的消费者

import pulsar

def initialize_consumer():

    client = pulsar.Client('pulsar://localhost:6650')

    consumer = client.subscribe('my-topic', 'my-subscription')

    while True:
        msg = consumer.receive()
        try:
            output_string = f"Received message msg.data() id=msg.message_id()"
            print(output_string)
            with open('./output.txt', 'a') as f:
                f.write(output_string + '\n')
            # Acknowledge successful processing of the message
            consumer.acknowledge(msg)
        except:
            # Message failed to be processed
            consumer.negative_acknowledge(msg)

    client.close()

【问题讨论】:

你已经尝试过什么? Docker Compose wait for container X before starting Y 中的任何建议对您有帮助吗? 是的,确实如此。我实际上只是从那个对我有用的线程中实现了一个解决方案。我很快就会在这里发布我的“解决方案”。 【参考方案1】:

这个帖子帮助了我,因为我遇到了一个 Docker 特定的问题:Docker Compose wait for container X before starting Y

我基本上为我的standalone 图像添加了一个healthcheck,然后为我的conprod 图像使用了restart: on-failure,这似乎有效。

我仍然对上述实际消费者函数中以 python 为中心的解决方案感兴趣。

docker-compose.yaml 文件最终看起来像这样:

version: '3.8'
services:
  standalone:
    hostname: standalone
    container_name: standalone
    image: apachepulsar/pulsar:2.8.1
    ports:
      - 8080:8080
      - 6650:6650
    command: bin/pulsar standalone
    healthcheck:
      test: ["CMD", "nc", "-vz", "localhost", "6650"]
      interval: 20s
      timeout: 5s
      retries: 5
    networks:
      - conprod
  conprod:
    hostname: conprod
    container_name: conprod
    build:
      context: .
      dockerfile: ./Dockerfile
    ports:
      - 80:80
    restart: on-failure
    depends_on:
      - standalone
    networks:
      - conprod
networks:
  conprod:

【讨论】:

以上是关于如何告诉python使用者等待客户端启动的主要内容,如果未能解决你的问题,请参考以下文章

Pytho之Django

如何告诉 PowerShell 在开始下一个命令之前等待每个命令结束?

Python如何将RGB图像转换为Pytho灰度图像?

Socket.io python服务器

如何将 sqlite3 模块添加到 Python?

如何下载安装Python