2009-03-18 41 views
51

Tôi đã viết một ứng dụng Python nhỏ chạy dưới dạng daemon. Nó sử dụng luồng và hàng đợi.Giao tiếp với trình chạy da trăn đang chạy

Tôi đang tìm cách tiếp cận chung để thay đổi ứng dụng này để tôi có thể giao tiếp với ứng dụng trong khi đang chạy. Chủ yếu là tôi muốn có thể theo dõi sức khỏe của nó.

Tóm lại, tôi muốn để có thể làm điều gì đó như thế này:

python application.py start # launches the daemon 

Sau đó, tôi muốn để có thể đi cùng và làm điều gì đó như:

python application.py check_queue_size # return info from the daemonized process 

Để rõ ràng, tôi không gặp bất kỳ vấn đề nào khi triển khai cú pháp lấy cảm hứng từ Django. Những gì tôi không có bất kỳ ý tưởng làm thế nào để làm là gửi tín hiệu đến quá trình daemonized (bắt đầu), hoặc làm thế nào để viết daemon để xử lý và đáp ứng các tín hiệu như vậy.

Như tôi đã nói ở trên, tôi đang tìm cách tiếp cận chung. Người duy nhất tôi có thể nhìn thấy ngay bây giờ là nói với daemon liên tục đăng nhập tất cả mọi thứ có thể cần thiết cho một tập tin, nhưng tôi hy vọng có một cách ít lộn xộn hơn để đi về nó.

CẬP NHẬT: Chà, rất nhiều câu trả lời tuyệt vời. Cám ơn rất nhiều. Tôi nghĩ rằng tôi sẽ xem xét cả hai phương pháp tiếp cận Pyro và web.py/Werkzeug, vì Twisted là một chút hơn tôi muốn cắn vào thời điểm này. Thách thức khái niệm tiếp theo, tôi cho rằng, là làm thế nào để nói về chủ đề công nhân của tôi mà không treo chúng lên.

Xin cảm ơn một lần nữa.

Trả lời

19

Còn việc chạy máy chủ http thì sao?

Có vẻ như điên nhưng chạy một máy chủ web đơn giản cho quản trị máy chủ của bạn yêu cầu chỉ là một vài dòng sử dụng web.py

Bạn cũng có thể xem xét việc tạo một ống unix.

+0

Cũng +1 cho giao diện HTTP. Một kịch bản lệnh python có thể phân tích các tùy chọn dòng lệnh và gửi các lệnh XMLRPC đến một máy chủ HTTP nội bộ. –

+0

+1: HTTP. Nhúng một ứng dụng WSGI nhỏ vào daemon để trả lời các yêu cầu. –

+1

(và @VanGale và @ S.Lott) có thể ai đó vui lòng cung cấp tài liệu tham khảo/ví dụ để chạy máy chủ http cho mục đích nhận lệnh như OP được mô tả không? Tôi cần phải làm điều này, nhưng muốn một chút chi tiết hơn. – synaptik

5

Giả sử bạn đang ở dưới * nix, bạn có thể gửi tín hiệu đến chương trình đang chạy với kill từ trình bao (và tương tự trong nhiều môi trường khác). Để xử lý chúng từ bên trong python, hãy kiểm tra mô-đun signal.

+0

Bạn có thể gửi tín hiệu qua 'kill' không? Nếu không, có lẽ viết lại câu trả lời này là 'kill', theo hiểu biết tốt nhất của tôi, chỉ có thể gửi một tín hiệu 'kill', điều này không có ích gì đặc biệt ở đây – puk

+0

@puk bạn thực sự gửi các tín hiệu khác với kill bằng cách sử dụng bạn '-s 'tham số, ví dụ 'kill -s QUIT '. –

9

Tôi sẽ sử dụng xoắn với ống có tên hoặc chỉ mở ổ cắm. Hãy xem máy chủ echo và ứng dụng khách examples. Bạn sẽ cần phải sửa đổi máy chủ echo để kiểm tra một số chuỗi được truyền bởi máy khách và sau đó trả lời với bất kỳ thông tin được yêu cầu nào.

Vì vấn đề về luồng của Python, bạn sẽ gặp sự cố khi trả lời các yêu cầu thông tin trong khi đồng thời tiếp tục làm bất cứ điều gì daemon có ý định thực hiện. Các kỹ thuật không đồng bộ hoặc giả mạo các quy trình khác là lựa chọn duy nhất của bạn.

+1

+1 cho Twisted, xem thêm twisted.manhole cung cấp giao diện telnet trực tiếp vào trình thông dịch đang chạy: http://twistedmatrix.com/projects/core/documentation/howto/telnet.html –

+0

"[...] bạn là sẽ gặp khó khăn khi trả lời các yêu cầu thông tin trong khi đồng thời tiếp tục làm bất cứ điều gì daemon có nghĩa là làm anyways " Tôi thấy rằng yêu cầu đó không được hỗ trợ. Nếu bạn có nghĩa là GIL, nó không ngăn chặn loại đồng tình này cả. –

+0

Um, "vấn đề luồng" là gì? –

7
# your server 

from twisted.web import xmlrpc, server 
from twisted.internet import reactor 

class MyServer(xmlrpc.XMLRPC): 

    def xmlrpc_monitor(self, params):   
     return server_related_info 

if __name__ == '__main__': 
    r = MyServer() 
    reactor.listenTCP(8080, Server.Site(r)) 
    reactor.run() 

Khách hàng có thể được viết bằng xmlrpclib, kiểm tra mã ví dụ here.

+0

Bạn có thể dễ dàng viết máy chủ và máy khách mà không phụ thuộc vào xoắn, nhưng đây là một câu trả lời hay. –

16

Sử dụng werkzeug và làm cho daemon của bạn bao gồm máy chủ WSGI dựa trên HTTP.

Trình nền của bạn có bộ sưu tập các ứng dụng WSGI nhỏ để trả lời thông tin trạng thái.

Máy khách của bạn chỉ cần sử dụng urllib2 để thực hiện yêu cầu POST hoặc GET đối với localhost: somePort. Máy khách và máy chủ của bạn phải đồng ý về số cổng (và số của URL).

Điều này rất đơn giản để triển khai và có khả năng mở rộng. Thêm các lệnh mới là một bài tập tầm thường.

Lưu ý rằng daemon của bạn không phải trả lời bằng HTML (điều này thường đơn giản). Các daemon của chúng ta đáp ứng với các yêu cầu WSGI với các đối tượng trạng thái được mã hóa JSON.

34

Tuy nhiên, một cách tiếp cận khác: sử dụng Pyro (đối tượng từ xa Python).

Pyro về cơ bản cho phép bạn xuất bản các cá thể đối tượng Python dưới dạng các dịch vụ có thể được gọi từ xa. Tôi đã sử dụng Pyro cho mục đích chính xác mà bạn mô tả, và tôi thấy nó hoạt động rất tốt.

Theo mặc định, trình nền máy chủ Pyro chấp nhận các kết nối từ mọi nơi. Để hạn chế điều này, hãy sử dụng trình xác thực kết nối (xem tài liệu) hoặc cung cấp host='127.0.0.1' cho hàm tạo Daemon để chỉ nghe các kết nối cục bộ.

Ví dụ mã lấy từ tài liệu Pyro:

server

 
import Pyro.core 

class JokeGen(Pyro.core.ObjBase): 
     def __init__(self): 
       Pyro.core.ObjBase.__init__(self) 
     def joke(self, name): 
       return "Sorry "+name+", I don't know any jokes." 

Pyro.core.initServer() 
daemon=Pyro.core.Daemon() 
uri=daemon.connect(JokeGen(),"jokegen") 

print "The daemon runs on port:",daemon.port 
print "The object's uri is:",uri 

daemon.requestLoop() 

Khách hàng

 
import Pyro.core 

# you have to change the URI below to match your own host/port. 
jokes = Pyro.core.getProxyForURI("PYROLOC://localhost:7766/jokegen") 

print jokes.joke("Irmen") 

Một dự án tương tự là RPyC. Tôi đã không thử RPyC.

4

Bạn có thể liên kết nó với Pyro (http://pythonhosted.org/Pyro4/) đối tượng từ xa Python. Nó cho phép bạn truy cập từ xa các đối tượng python. Nó dễ thực hiện, có chi phí thấp và không xâm lấn như Twisted.

+0

Tôi nghĩ rằng các liên kết bạn cung cấp cho Pyro là một số pyro khác (một phần mềm phân tích nhiệt động lực học), không phải là một trong những bạn nghĩ rằng đó là (hoặc nó atleast là NOW). – ironstein

+0

Mọi thứ thay đổi trong bảy năm. Tôi đã cập nhật với repo hiện tại. – directedition

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