Python3 Gearman 使用
網(wǎng)上很多資料對(duì)python gearman的使用都是用的gearman模塊,然而這個(gè)模塊僅支持python2.x ,使用python3的pip install安裝,會(huì)因?yàn)椴恢С值膒ython2語(yǔ)法報(bào)錯(cuò),根本無(wú)法使用。 想用python3的資料特別少。
安裝
首先先安裝gearman:sudo apt-get install gearman libgearman-dev
安裝python3對(duì)應(yīng)的gearman模塊
安裝:pip install python3-gearman
如果系統(tǒng)里有多個(gè)版本的python,注意使用python3 -m pip install python3-gearman 避免安裝到別的版本里去。
最簡(jiǎn)示例:
server端:
import python3_gearman gm_worker = python3_gearman.GearmanWorker(['localhost:4730'])# 定義收到消息的處理函數(shù),返回值必須是個(gè)byte string。 def task_listener(gearman_worker, gearman_job):print(gearman_job.data)return "" # 注冊(cè)消息處理,msg為自定義的,和client保持一致 gm_worker.register_task('msg', task_listener) # 啟動(dòng)監(jiān)聽 gm_worker.work()client端:
import python3_gearman gm_client = python3_gearman.GearmanClient(['localhost:4730', 'otherhost:4730']) gm_client.submit_job("msg", "hello world") # 發(fā)送消息,msg是自定義的,要和server端協(xié)商保持一致先啟動(dòng)server,然后運(yùn)行client。成功的話,client非阻塞,每次運(yùn)行,server端會(huì)打印出對(duì)應(yīng)的字符串。
進(jìn)階實(shí)例:
- 兩端發(fā)送和接收解析相對(duì)復(fù)雜的json數(shù)據(jù):# server端:將上面的tesk_listener函數(shù)改為如下即可: j = json.loads(gearman_job.data) # client端:用json.dumps將一個(gè)復(fù)雜的字典傳入,代替原來(lái)的"hello world即可"
- 客戶端對(duì)發(fā)送結(jié)果進(jìn)行校驗(yàn)
submit_job的返回值是一個(gè)結(jié)果定值,可以通過校驗(yàn)這個(gè)值來(lái)判斷發(fā)送是否成功:import python3_gearman from python3_gearman.job import JOB_UNKNOWN def check_request_status(job_request):if job_request.complete:print ("Job %s finished! Result: %s - %s" % (job_request.job.unique, job_request.state, job_request.result))elif job_request.timed_out:print ("Job %s timed out!" % job_request.unique)elif job_request.state == JOB_UNKNOWN:print ("Job %s connection failed!" % job_request.unique)gm_client = python3_gearman.GearmanClient(['localhost:4730', 'otherhost:4730'])submitted_job_request = gm_client.submit_job("msg", "hello world")check_request_status(submitted_job_request) - 設(shè)置數(shù)據(jù)高優(yōu)先級(jí),設(shè)置發(fā)送方式為后臺(tái)非阻塞模式
可以通過submit_job的參數(shù)進(jìn)行配置,priority=python3_gearman.PRIORITY_HIGH指定高優(yōu)先級(jí), background=True指定通過后臺(tái)非阻塞的方式發(fā)送。submitted_job_request = gm_client.submit_job("msg", "hello world", priority=python3_gearman.PRIORITY_HIGH, background=True)
完整代碼:
server端:
client端:
import python3_gearman from python3_gearman.job import JOB_UNKNOWN import jsondef check_request_status(job_request):if job_request.complete:print ("Job %s finished! Result: %s - %s" % (job_request.job.unique, job_request.state, job_request.result))elif job_request.timed_out:print ("Job %s timed out!" % job_request.unique)elif job_request.state == JOB_UNKNOWN:print ("Job %s connection failed!" % job_request.unique)gm_client = python3_gearman.GearmanClient(['localhost:4730', 'otherhost:4730'])msg_dict = {"name":"threedog","age":18,"class":{"name":"一班","number":1} }submitted_job_request = gm_client.submit_job("msg", json.dumps(msg_dict), priority=python3_gearman.PRIORITY_HIGH, background=False)check_request_status(submitted_job_request)文檔
對(duì)于任何框架和工具,文檔都是非常重要的一部分。比如上面的例子中,我們想知道除了JOB_UNKNOWN還有什么其他的狀態(tài)?除了PRIORITY_HIGH還有什么可選的優(yōu)先級(jí)。這些都需要借助文檔。
然而python3-gearman這個(gè)小項(xiàng)目網(wǎng)上資料很少,而且沒有找到官網(wǎng)文檔的地址。
好在,潛心研究之下還是找到了官方提供的文檔所在:這個(gè)項(xiàng)目是托管在github上的:https://github.com/josiahmwalton/python3-gearman 點(diǎn)開這個(gè)項(xiàng)目你會(huì)發(fā)現(xiàn)有自帶的docs
只不過這個(gè)里面放的并不是html或者md格式的文檔,而是一些rst后綴的文本文件和一個(gè)Makefile。這是一種很常用的文檔生成的格式,rst就是文檔源格式,便于書寫,但是可讀性較差。可以通過在這個(gè)目錄下運(yùn)行執(zhí)行make +格式的方式,生成指定格式的文檔。
操作方法如下:
# 安裝工具 sudo apt-get install python3-sphinx # 文檔下載 git clone https://github.com/josiahmwalton/python3-gearman.git # 文檔生成 cd python3-gearman/docs/ make html # 指定為html格式,直接輸入make會(huì)提示有哪些可選的格式完成后會(huì)在docs目錄下生成一個(gè)_build目錄,里面包含詳細(xì)的官方文檔和實(shí)例,我上面的示例代碼也是從官方文檔的實(shí)例中抽絲剝繭扒出來(lái)的:
總結(jié)
以上是生活随笔為你收集整理的Python3 Gearman 使用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: html5-audio标签不能自动播放的
- 下一篇: Vue+flask物业缴费-车位电梯消防