Tôi đang cố gắng tiêu thụ luồng sự kiện được cung cấp bởi Kubernetes api bằng mô-đun requests
. Tôi đã gặp phải vấn đề về bộ đệm là : mô-đun requests
dường như bị trễ bởi một sự kiện.Đọc phản hồi trực tuyến http bằng thư viện "yêu cầu" Python
Tôi có mã mà trông giống như sau:
r = requests.get('http://localhost:8080/api/v1beta1/watch/services',
stream=True)
for line in r.iter_lines():
print 'LINE:', line
Như Kubernetes phát ra thông báo sự kiện, mã này sẽ chỉ hiển thị các sự kiện cuối cùng phát ra khi một sự kiện mới đến, mà làm cho nó gần như hoàn toàn vô dụng cho mã cần phản hồi với dịch vụ thêm/xóa sự kiện.
tôi đã giải quyết điều này bằng cách đẻ trứng curl
trong một tiến trình con thay vì sử dụng thư viện requests
:
p = subprocess.Popen(['curl', '-sfN',
'http://localhost:8080/api/watch/services'],
stdout=subprocess.PIPE,
bufsize=1)
for line in iter(p.stdout.readline, b''):
print 'LINE:', line
này hoạt động, nhưng tại các chi phí của một số linh hoạt. Có cách nào để tránh sự cố lưu vào bộ đệm này với thư viện requests
không?
Có thể lập luận rằng việc triển khai nào là chính xác - bạn sẽ chèn một "ngắt dòng logic hợp lý" nếu có thêm dữ liệu. Cách tiếp cận chính xác dường như là tìm ra tổng kích thước của dữ liệu (chỉ định một yêu cầu cho truyền thông TCP) và chỉ sử dụng đọc một phần ở đầu đã biết. –
Tôi không nghĩ rằng bạn có thể lập luận rằng việc triển khai hiện tại là chính xác. Mỏ chưa trải qua thử nghiệm nghiêm ngặt, nhưng nó chắc chắn hoạt động tốt hơn. Việc triển khai chính xác hơn - lý tưởng được gửi dưới dạng bản vá thượng nguồn - sẽ cực kỳ hữu ích. – larsks
@ivan_pozdeev * "Cách tiếp cận chính xác dường như tìm ra tổng kích thước dữ liệu (chỉ định một yêu cầu cho truyền thông TCP)" * - Không, TCP là luồng * và có thể có độ dài vô hạn. Tôi không chắc bạn đã nghe về điều đó nhưng về cơ bản là không đúng sự thật. –