Python如何快速實現分散式任務?
本文和大家分享的主要是使用python實現分散式任務相關內容,一起來看看吧,希望對大家有所幫助。
深入讀了讀python的官方文件,發覺Python自帶的multiprocessing模組有很多預製的介面可以方便的實現多個主機之間的通訊,進而實現典型的生產者-消費者模式的分散式任務架構。
之前,為了在Python中實現生產者-消費者模式,往往就會選擇一個額外的佇列系統,比如rabbitMQ之類。此外,你有可能還要設計一套任務物件的序列化方式以便塞入佇列。如果沒有佇列的支援,那不排除有些同學不得不從socket伺服器做起,直接跟TCP/IP打起交道來。
其實multiprocessing.managers中有個BaseManager就為開發者提供了這樣一個快速介面。
我們假定的場景是1個生產者(producer.py)+8個消費者(worker.py)的系統,還有一箇中央節點負責協調(server.py)實現如下:
server.py
from multiprocessing.managers import BaseManagerimport Queue
queue = Queue.Queue() #初始化一個Q,用於訊息傳遞class QueueManager(BaseManager):
pass
QueueManager.register('get_queue', callable=lambda:queue) # 在系統中釋出get_queue這個業務
if __name__ == '__main__':
m = QueueManager(address=('10.239.85.193', 50000),authkey='abr' )
# 監聽所有10.239.85.193的50000口
s = m.get_server()
s.serve_forever()
worker.py
from multiprocessing.managers import BaseManagerfrom multiprocessing import Pool
class QueueManager(BaseManager):
pass
QueueManager.register('get_queue')
def feb(i): #經典的'山羊增殖'
if i
if i
return feb(i-1) + feb(i-2) - feb(i-5)
def worker(i):
m = QueueManager(address=('10.239.85.193', 50000), authkey='abr')#連線server
m.connect()
while True:
queue = m.get_queue()# 獲取Q
c = queue.get()
print feb(c)
if __name__ == '__main__':
p = Pool(8) # 分程式啟動8個worker
p.map(worker, range(8))
producer.py
from multiprocessing.managers import BaseManager
class QueueManager(BaseManager):
pass
QueueManager.register('get_queue')
if __name__ == '__main__':
m = QueueManager(address=('10.239.85.193', 50000), authkey='abr')
m.connect()
i = 0
while True:
queue = m.get_queue()
queue.put(48)
i+=1
系統會直接將Queue() 物件中的資料直接封裝後透過TCP 50000埠在主機之間傳遞。不過需要注意的是,由於authkey的緣故,各個節點要求python的版本一致。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/2236/viewspace-2814230/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Apache ShardingSphere 如何實現分散式事務Apache分散式
- Spring Boot Quartz 分散式叢集任務排程實現Spring Bootquartz分散式
- 微服務實踐之分散式定時任務微服務分散式
- 分散式政企應用如何快速實現雲原生的微服務架構改造分散式微服務架構
- Hatchet:Python中分散式、容錯任務佇列Python分散式佇列
- 分散式任務排程分散式
- 分散式事務(3)---RocketMQ實現分散式事務原理分散式MQ
- 基於rabbitmq延遲外掛實現分散式延遲任務MQ分散式
- 分散式任務排程平臺XXL-JOB快速搭建教程分散式
- 分散式事務(4)---RocketMQ實現分散式事務專案分散式MQ
- 分散式排程任務-ElasticJob分散式AST
- 基於asyncio和redis的Python分散式任務佇列RedisPython分散式佇列
- go-zero微服務實戰系列(十、分散式事務如何實現)Go微服務分散式
- 專案實戰!接入分散式定時任務框架分散式框架
- 實戰與原理:如何基於RocketMQ實現分散式事務?MQ分散式
- Redis如何實現分散式鎖Redis分散式
- LTS分散式任務排程部署分散式
- 淺談分散式任務排程系統Celery的設計與實現分散式
- SpringBoot如何實現定時任務Spring Boot
- Java如何實現定時任務?Java
- 如何實現跨Mysql、Redis和Mongo分散式事務? - dongfuMySqlRedisGo分散式
- Java 分散式任務排程平臺:PowerJob 快速開始+配置詳解Java分散式
- 使用Spring Boot實現分散式事務Spring Boot分散式
- 基於RocketMQ實現分散式事務MQ分散式
- SpringCloud+RocketMQ實現分散式事務SpringGCCloudMQ分散式
- 利用Python+Redis實現分散式鎖PythonRedis分散式
- 如何使用Redis實現分散式鎖Redis分散式
- 如何用 Redis 實現分散式鎖Redis分散式
- ElasticSearch是如何實現分散式的?Elasticsearch分散式
- 分散式之延時任務方案解析分散式
- Linux中如何實現定時任務Linux
- SpringBoot自定義starter開發分散式任務排程實踐Spring Boot分散式
- 分散式服務高可用實現:複製分散式
- AspNetCore&MassTransit Courier實現分散式事務NetCore分散式
- Golang 實現 Redis(8): TCC分散式事務GolangRedis分散式
- 分散式事務的幾種實現方式分散式
- Dubbo+zookeeper實現分散式服務框架分散式框架
- 淺談分散式定時任務之quartz分散式quartz