2012-02-11 36 views
9

Tôi gặp sự cố khi popen bế tắc. Cụ thể, các chủ đề (không phải là chủ đề chính) mà chạy popen bị mắc kẹt tại:Bế tắc trong popen của quy trình con của Python

File: "/usr/lib/python2.7/subprocess.py", line 679, in __init__ 
    errread, errwrite) 
File: "/usr/lib/python2.7/subprocess.py", line 1224, in _execute_child 
    data = _eintr_retry_call(os.read, errpipe_read, 1048576) 
File: "/usr/lib/python2.7/subprocess.py", line 478, in _eintr_retry_call 
    return func(*args) 

Với ps, tôi có thể thấy rằng quá trình trăn đã chia hai chính nó, nhưng nó vẫn chưa chạy os.execvp. Điều này có thể được nhìn thấy bằng cách kiểm tra ps, nơi tôi thấy rằng có một quá trình con của quá trình chính của tôi có cùng tên. Giết chết quá trình đó làm cho luồng bị kẹt trong phần tử cha tiếp tục.

Theo như tôi có thể biết, quy trình con (sẽ execvp) đang khóa ở đâu đó trong 50 dòng giữa tạo và chạy os.execvp của nó. Để làm phức tạp vấn đề, nó là hiếm; có lẽ 1 trong 100 popens. Việc khóa này có thể xảy ra như thế nào? Làm thế nào để tôi sửa chữa nó? (Tôi không thể tái tạo hành vi này trong một chương trình python đơn giản).

Tôi nên lưu ý rằng mặc dù chương trình này vô cùng đa luồng (hàng trăm chủ đề đang chạy), không có chủ đề nào khác sử dụng popen. Nhiều chủ đề khác đang làm việc với các bộ mô tả tập tin (chủ yếu là các ổ cắm).

ghi chú kỹ thuật:

  • Chạy trên Amazon EC2
  • Linux x86_64 3.0.0-14-ảo trong ubuntu 11.10
  • python 2.7.2 phiên dịch.
  • Sử dụng một số thư viện bao gồm paramiko và boto

Trả lời

Các vấn đề liên quan