2015-10-05 101 views
0

我一直在尋找一種方式來運行一個Python應用程序瓶,而同時使用GEVENT處理請求連續後臺任務:長期運行的後臺任務

from gevent import monkey; monkey.patch_all() 
from time import sleep 
from bottle import route, run 

# run_background_function() 
# ^^^^ starts a single background task that runs every few seconds 
# and continues for the life of the whole Bottle application. 

@route('/simple-request') 
def simple_request(): 
    # a simple function that returns a rendered page and 
    # is capable of serving multiple requests 
    return rendered_page() 

run(host='0.0.0.0', port=8080, server='gevent') 

我雖然讀許多stackoverflow線程和7個完整的教程到目前爲止包括Gevent,線程,芹菜,rabbitmq,redis和不知道我應該用什麼來實現這種能力。 Celery,RabbitMQ和Redis對於運行這一個後臺任務似乎都非常困難和矯枉過正,再加上如果可能的話,我寧願在Python標準庫中保留選項。

到目前爲止我發現的教程從非常基本的開始,然後突然跳躍到包括第三方庫,套接字,特定的web框架等。是否沒有辦法在Python線程模塊上這樣做?

+0

芹菜的RabbitMQ和Redis的不是瘋狂的困難。他們可能會或可能不會爲你的情況矯枉過正,這取決於你的需求的細節。 – scytale

+0

@scytale。好吧,也許不是非常困難,但在嘗試了大量教程和這些軟件包的入門指南之後,它們最引人注目的一個基本介紹,它帶有比所需更復雜的示例代碼。對於一個沒有這樣做的例子,在兩個段落中清楚地解釋了一個概念(隊列/列表解釋),請看這裏:[Multithreading/Queues](http://www.troyfawkes.com/learn-python-multithreading-queues -basics /) – zilog6502

+0

本教程針對的是熟悉基本編程概念的程序員 - 他們無法解釋_everything_ - 您只需要做更多的閱讀 – scytale

回答

1

你可以用multiprocessing做到這一點:

from multiprocessing import Queue, Process 

def processor(): 
    setproctitle('%s - processor ' % (__file__,)) 

    while True: 
     time.sleep(1) 
     do_stuff() 

my_processor = Process(target=processor) 
+0

就在我嘗試整合之前,我假設我可以將my_processor調用粘貼到我的Bottle應用程序代碼的頂部,並且它不會阻止其他應用程序與Gevent一起運行? – zilog6502

+0

是的,它應該沒問題 - 你不會在'my_processor'中使用gevent,對吧? – scytale

+0

,你需要添加一些代碼來清理你的主循環退出時的工作人員 – scytale