2013-03-01 255 views
0

我需要製作將在後臺運行的腳本,腳本將始終打開與memcached服務器的連接並從其他程序獲取參數,當recive parametar腳本執行時一些工作並將一些信息輸出回第一個程序。 我最大的問題是如何使腳本在後臺運行並等待參數?Python:在後臺運行腳本並執行輸入/輸出

+1

它是如何獲得的參數?從套接字? – abarnert 2013-03-01 22:19:38

+0

Soory我忘了說,我用簡單的命令行「.app.py --information」傳遞參數,我期待在一秒鐘內有大約1000-2000個參數(發送到那個腳本)... – Squirll 2013-03-01 22:47:23

+0

如何傳遞參數在腳本已經運行的命令行上?這沒有任何意義。當然你可以編寫一個驅動腳本(在後臺運行)和一個控制腳本,例如'httpd'和'apachectl',你甚至可以將它們合併到同一個腳本中(所以它的作用就像驅動程序與一組參數,否則控制現有的驅動程序),但這聽起來不像你的建議。 – abarnert 2013-03-01 22:52:27

回答

0

不知道你是如何從其他程序獲取參數的,或者你是如何等待的,很難給出具體的答案。

爲了說明方便,我們假設它正在偵聽到端口6789的TCP連接,而另一個程序只是連接到該套接字併發送固定數量的參數,並用換行符分隔。

要做到這一點最簡單的方法是隻塊:

memcache_connection = # however you set this up 
sock = socket.socket() 
sock.bind(('', 6789)) 
sock.listen(5) 
while True: 
    conn, addr = sock.accept() 
    with contextlib.closing(conn) as client: 
     with client.makefile() as f: 
      param1, param2, param3 = f 
     result = do_memcache_stuff(memcache_connection, param1, param2, param3) 
     client.sendall(result) 

顯然沒有錯誤處理這裏,沒辦法退出比其他^ C,但這些東西是很容易添加。

更嚴重的是,它一次只能處理一個命令。如果這是一個問題,那麼通常有兩種選擇:線程化或事件循環。如果您不需要在兩個客戶端連接之間共享信息,並且一次不需要處理多個數字,則線程通常更簡單。你所要做的就是將處理函數包裝在一個函數中,然後產生它。所以:

def handle_client(conn): 
    with contextlib.closing(conn) as client: 
     with client.makefile() as f: 
      param1, param2, param3 = f 
     result = do_memcache_stuff(memcache_connection, param1, param2, param3) 
     client.sendall(result) 

memcache_connection = # however you set this up 
sock = socket.socket() 
sock.bind(('', 6789)) 
sock.listen(5) 
while True: 
    conn, addr = sock.accept() 
    t = threading.Thread(target=handle_client, args=(conn,)) 
    t.daemon = True 
    t.start() 
0

你想要做什麼叫做多線程,蟒蛇文檔閱讀起來就可以了還是自己試試它了:從其他程序

import threading