Tôi có một số mã Python thực thi một ứng dụng bên ngoài hoạt động tốt khi ứng dụng có một lượng nhỏ đầu ra, nhưng bị treo khi có rất nhiều. Mã của tôi trông giống như:Sử dụng subprocess.Popen cho quá trình với đầu ra lớn
p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
errcode = p.wait()
retval = p.stdout.read()
errmess = p.stderr.read()
if errcode:
log.error('cmd failed <%s>: %s' % (errcode,errmess))
Có ý kiến trong tài liệu dường như cho biết vấn đề tiềm ẩn. Dưới chờ đợi, có:
Cảnh báo: Đây sẽ bế tắc nếu quá trình con tạo ra đủ sản lượng để một ống
stdout
hoặcstderr
như vậy mà nó khối chờ đợi bộ đệm ống OS để chấp nhận dữ liệu hơn. Sử dụngcommunicate()
để tránh điều đó.
dù dưới giao tiếp, tôi thấy:
Lưu ý Các dữ liệu đọc được đệm trong bộ nhớ, do đó, không sử dụng phương pháp này nếu kích thước dữ liệu quá lớn hoặc không giới hạn.
Vì vậy, không rõ ràng với tôi rằng tôi nên sử dụng một trong những điều này nếu tôi có một lượng lớn dữ liệu. Họ không chỉ ra phương pháp nào tôi nên sử dụng trong trường hợp đó.
Tôi cần giá trị trả lại từ lệnh exec và phân tích cú pháp và sử dụng cả hai stdout
và stderr
.
Vì vậy, một phương pháp tương đương trong Python để thực thi một ứng dụng bên ngoài sẽ có đầu ra lớn là gì?
Có vẻ như "lớn" trong giao tiếp tài liệu là * lớn hơn nhiều * hơn bạn có khả năng chờ đợi, và chắc chắn lớn hơn nhiều so với thông thường. Ví dụ, bạn có thể xuất 10MB văn bản và hầu hết các hệ thống sẽ ổn với giao tiếp. Đầu ra của 1GB khi bạn chỉ có 1GB RAM sẽ là một câu chuyện khác. –