2012-03-19 7 views
18

Tôi phải viết chương trình daemon liên tục chạy trong nền và thực hiện một số tác vụ đơn giản. Logic không phức tạp chút nào, tuy nhiên nó phải chạy trong thời gian dài và ổn định.Có phải viết một daemon bằng Python là một ý tưởng hay không?

Tôi nghĩ C++ sẽ là một lựa chọn tốt cho việc viết loại ứng dụng này, tuy nhiên tôi cũng đang xem xét Python vì nó dễ viết và kiểm tra điều gì đó nhanh hơn trong đó.

Sự cố mà tôi gặp phải với Python là tôi không chắc chắn môi trường thời gian chạy của nó sẽ hoạt động như thế nào trong một khoảng thời gian dài. Nó có thể ăn nhiều hơn và nhiều bộ nhớ hơn vì một số quirks GC? Nó có thể sụp đổ bất ngờ? Tôi chưa bao giờ viết daemon trong Python trước đây, vì vậy nếu có ai ở đây, hãy chia sẻ kinh nghiệm của bạn. Cảm ơn!

+4

Điều này có thể hữu ích: http://pypi.python.org/pypi/python-daemon/ (không bao giờ sử dụng nó). –

Trả lời

14

Tôi đã viết một số daemon trong Python cho công ty cuối cùng của tôi. Câu trả lời ngắn gọn là, nó hoạt động tốt. Miễn là bản thân mã không có một số bộ nhớ bom lớn, tôi chưa bao giờ thấy bất kỳ sự suy giảm dần dần hoặc hogging bộ nhớ nào. Hãy chú ý đến mọi thứ trong phạm vi toàn cầu hoặc lớp học, vì chúng sẽ tồn tại, vì vậy hãy sử dụng số del tự do hơn mức bình thường của bạn. Nếu không, như tôi đã nói, không có vấn đề nào tôi có thể báo cáo.

Và trong trường hợp bạn đang tự hỏi, chúng chạy hàng tháng và hàng tháng (giả sử 6 tháng thường) giữa các lần khởi động lại thường xuyên với các vấn đề không.

+0

bạn đã sử dụng thư viện nào cho các daemon này? python-daemon? daemonize? – Zaroth

+0

@Zaroth không có thư viện, chỉ là một ngã ba tiêu chuẩn. –

4

Có thể bị rò rỉ. Có, nó có thể sụp đổ bất ngờ. Mọi thứ đều có thể.

Tôi muốn nói rằng bạn có nhiều khả năng kết thúc vô tình bị rò rỉ trong môi trường với quản lý bộ nhớ thủ công (ví dụ: C++) so với bạn đang sử dụng một cái gì đó như Python.

Đối đâm bất ngờ, tốt, rất có thể là một khối u độc đoán của Python có thể có nhiều khả năng lỗi không mong đợi hơn một lần tùy ý của Java, vì những lợi ích sau từ static typing nơi bạn có thể nắm bắt một tải toàn bộ lỗi tại thời gian biên dịch , đó là Python với duck typing và các dạng linh hoạt khác.

Thực tế, Python có vẻ là lựa chọn hoàn hảo hợp lý cho những gì bạn muốn làm. Hãy xem một cái gì đó như Twisted cho một động cơ khá để xây dựng mọi thứ xung quanh, hoặc ít nhất là cho một ý tưởng về cấu trúc (câu hỏi của bạn giống như một số phân công trường học, vì vậy tôi không chắc chắn bao nhiêu tự do thực hiện bạn nhận được)

+1

Twisted thực sự là một khuôn khổ mạng, OP không bao giờ nói đây là một daemon mạng. –

+3

Python được gõ mạnh mẽ và vịt gõ – wim

+1

@Chris: Điểm công bằng, mặc dù khi tôi nghĩ về Twisted tôi nghĩ nhiều hơn về "sự kiện dựa trên" hơn tôi làm mạng, mà tôi cảm thấy là một mô hình tốt cho bất kỳ loại daemon –

1

Tôi đã viết nhiều thứ trong C/C++ và Perl được khởi tạo khi hệ điều hành LINUX box khởi động, khởi chạy chúng bằng rc.d. Ngoài ra tôi đã viết một vài kịch bản java và python được bắt đầu giống như cách tôi đã đề cập ở trên, nhưng tôi cần một tập lệnh shell nhỏ (tệp .sh) để khởi chạy chúng và tôi đã sử dụng rc.5. .

Hãy để tôi nói với bạn rằng những lo ngại của bạn về môi trường thời gian chạy là hoàn toàn hợp lệ, bạn sẽ phải cẩn thận về runlevel mà bạn sẽ sử dụng ... (chỉ từ rc.2 đến rc.5, vì rc.1 và rc.6 dành cho Hệ thống).

Nếu runlevel quá thấp, thời gian chạy python có thể không hoạt động tại thời điểm bạn khởi chạy chương trình và nó có thể bị lỗi. ví dụ: Trong LAMP Server MySQL và Apache được bắt đầu trong rc.3 nơi Mạng đã có sẵn.

Tôi nghĩ rằng bức ảnh đẹp nhất của bạn là tạo tập lệnh bằng python và khởi chạy nó bằng tệp .sh từ rc.5.

Chúc may mắn!

+0

Mức RC.x chính xác là gì? – Finglas

+1

Điều này có thể hữu ích: http://www.networkclue.com/os/Linux/run-levels.aspx –

+0

@Finglas Bạn có thể yêu cầu điều đó tại http://unix.stackexchange.com –