Python如何快速實現分散式任務?

coyan發表於2021-09-09

本文和大家分享的主要是使用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的版本一致。

原文連結:http://www.apkbus.com/blog-907513-68230.html

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/2236/viewspace-2814230/,如需轉載,請註明出處,否則將追究法律責任。

相關文章