Странное поведение Python-сокета в Docker-контейнере - PullRequest
0 голосов
/ 04 марта 2019

Я наблюдал поведение моего кода Python, выполняющегося в док-контейнере, я не понимаю.Может быть, кто-то может мне объяснить поведение и подсказать разницу между сокетом python на Ubuntu 18.04 и образом докера python: 3.6

Если я запускаю свой сокет UDPна моем хосте серверный поток разблокируется на каждой полученной дейтаграмме и выводит байты.Такое поведение я ожидаю.

Если я запускаю один и тот же код в Docker-контейнере, разблокировка и вывод на стандартный вывод отсутствуют.Если сервер останавливается с помощью ctrl + c, вывод выводится до исключения прерывания.

ОБНОВЛЕНИЕ

  • Добавить пример для печати потока в stdoutбез проблем.См. I / O Test.
  • Добавьте код, чтобы показать инстанцирование объектов и вызов start ().
  • Добавьте команды запуска Docker.Запустите контейнер и распечатайте стандартный вывод.
  • Удалите ненужный вывод print ().

Спасибо и наслаждайтесь моим жутким кодом!

Dockerfile: Server

FROM python:3.6

COPY . /workdir
EXPOSE 8888
WORKDIR /workdir
CMD ["./main.py"]

Dockerfile: тест ввода-вывода

FROM python:3.6

COPY . /workdir
EXPOSE 8888
WORKDIR /workdir
CMD ["./iotest.py"]

тест ввода-вывода (аналогично UDPServer, но без блокирующего сокета) *

import threading

    class iotest(threading.Thread):

        def __init__(self):
            threading.Thread.__init__(self)

        def run(self):
            print("Server Thread started!")
            try:
                while True:
                    print("Test i/o")
            except Exception as e:
                print("Exception catched")
                print(e)
            finally:
                print("Thread exited")

Сервер:

import threading
import socket


class UDPServer(threading.Thread):
    PORT = 8888
    HOST = '0.0.0.0'

    def __init__(self):
        threading.Thread.__init__(self)

    def run(self):
        print("Server Thread started!")
        try:
            s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
            s.bind((UDPServer.HOST, UDPServer.PORT))
            while True:
                msg = s.recv(4)
                print("Message received")
        except Exception as e:
            print("Exception catched")
            print(e)
        finally:
            print("Thread exited, Socket closed")
            s.close()

Тест ввода / вывода (аналогично UDPServer, но без блокирующего сокета) *

import threading

    class iotest(threading.Thread):

        def __init__(self):
            threading.Thread.__init__(self)

        def run(self):
            print("Server Thread started!")
            try:
                while True:
                    print("Test i/o")
            except Exception as e:
                print("Exception catched")
                print(e)
            finally:
                print("Thread exited")

Клиент:

import socket
import time

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.connect(('0.0.0.0', 8888))
count = 0
errors = 0
for i in range(10):
    isTime = time.time()
    msg = struct.pack('!f', isTime, )
    time.sleep(0.5)
    try:
        size_date_sent = s.send(msg)
        count += 1
    except Exception as identifier:
        errors += 1

print(str(count) + " MSG sent.")
print(str(errors) + " errors.")
s.close()

main.py:

import UDPServer

server = UDPServer.UDPServer()
server.start()

iotest.py

import iotest

thr = iotest.iotest()
thr.start

Сборка и запуск

docker build -t pythontest .
docker run -p 8888:8888/udp pythontest
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...