2012-02-28 45 views
14

Sau khi tôi đã chơi một thời gian bằng gói song song của R trên máy dựa trên Debian của tôi, tôi vẫn không thể tìm cách xóa tất cả các quy trình con zombie sau khi tính toán.Xóa các quá trình zombie bằng gói song song

Tôi đang tìm giải pháp độc lập chung và hệ điều hành.

Dưới đây là một kịch bản đơn giản minh họa vấn đề đối với 2 lõi:

library(parallel) 
testfun <- function(){TRUE} 

cltype <- ifelse(.Platform$OS.type != "windows", "FORK", "PSOCK") 
cl <- makeCluster(2, type = cltype) 
p <- clusterCall(cl, testfun) 
stopCluster(cl) 

Thật không may, kịch bản này rời hai quá trình zombie trong bảng quá trình mà chỉ nhận được giết nếu R là đóng cửa.

Trả lời

5

Điều này dường như chỉ là vấn đề với cụm "FORK". Thay vào đó, nếu bạn tạo cụm "PSOCK", các quy trình sẽ chết khi bạn gọi stopCluster(cl).

Có điều gì ngăn cản bạn sử dụng cụm "PSOCK" trên máy dựa trên Debian của bạn không?

+0

Xin chào Josh, Xin lỗi vì trả lời trễ của tôi - bạn nói đúng, điều này dường như chỉ là vấn đề đối với các cụm Fork. Các cụm PSOCK cũng hoạt động trên Máy Debian của tôi - chỉ nghĩ rằng Forking sẽ nhanh hơn. Cảm ơn rất nhiều! – user625626

+2

Điều này có vẻ là một sự giám sát ngớ ngẩn với các cụm FORK. Tôi đã đăng một báo cáo lỗi tại https://bugs.r-project.org/bugzilla3/show_bug.cgi?id=15471. Các quá trình Zombie chủ yếu là vô hại bởi vì chúng không tiêu thụ tài nguyên. Họ chỉ đang ngồi trong bảng tiến trình để quá trình cha mẹ có thể kiểm tra trạng thái thoát của họ. Kiểm tra trạng thái thoát của chúng với 'thư viện (fork) wait()' sẽ dọn sạch từng zombie một (và in ra trạng thái thoát của mỗi lần). – computermacgyver

+1

Gói ngã ba không còn nữa. – russellpierce

2

Có thể câu trả lời của sự cố của bạn nằm trong tệp trợ giúp của lệnh makeCluster().

Ở dưới cùng của tệp, nó được viết: Thực tiễn tốt là tắt nhân viên bằng cách gọi stopCluster: tuy nhiên, người lao động sẽ tự chấm dứt khi ổ cắm mà họ đang nghe lệnh không khả dụng, nên nếu phiên R chủ được hoàn thành (hoặc quá trình của nó chết).

Giải pháp là (nó đang làm việc cho tôi) để xác định cổng cho cụm của bạn trong khi bạn đang tạo cụm.

cl <- makeCluster(2, type = cltype,port=yourPortNumber) 

giải pháp khác (có thể không hữu ích) đang đặt thời gian chờ cho ổ cắm của bạn. biến thời gian chờ tính bằng giây.

cl <- makeCluster(2, type = cltype,port=yourPortNumber,timeout=50) 

Trong mọi trường hợp, mục đích phải làm cho kết nối ổ cắm không khả dụng.khi đóng cổng hoặc đóng quy trình R chính sẽ thực hiện việc này.

Chỉnh sửa: Ý của tôi là đóng các cổng mà quá trình đang nghe. Nó phải là hệ điều hành độc lập. bạn có thể thử sử dụng ->showConnections(all = TRUE);. Điều này sẽ cung cấp cho tất cả các kết nối. Sau đó, bạn có thể thử closeAllConnections();

Xin lỗi nếu điều này không hoạt động.

+0

Chỉ định số cổng không hoạt động đối với tôi trên Ubuntu. Bạn đang chạy phiên bản Debian nào? –

+0

Về chỉnh sửa của bạn: 'stopCluster (cl)' đã đóng các cổng. Đó là nguyên nhân khiến các quá trình trở thành quá trình zombie. –

+0

closeAllConnections() Hoạt động trên Windows với các chủ đề PSOCK – myloginid