Я наблюдал поведение моего кода 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