python分布式程序 managers

2021-10-06 08:40:03 字數 2622 閱讀 2701

多工實現方法可以是:多執行緒,多程序,非同步io(python中的協程)--通過單執行緒或者單程序實現多工

多工的任務型別:計算密集型,io密集型

計算密集型:並行才能根本提高速度,並行數最好是機器核數,過多的執行緒或者程序反而降低了效率,因為要切換。另外用速度快的語言最好,如c語言

io密集型:因為io與cpu的速度差距太大,導致大部分時間都是在等待io的過程,要盡量把等待的時間做有效的工作,所以併發量可以很大,但是也不能無限大,得有個限度,因為記憶體有限。這種型別的任務盡量用**量少的來寫,因為語言速度快

-- 阻塞 i/o(blocking io):阻塞,知道有結果,返回

-- 非阻塞 i/o(nonblocking io):不阻塞,直接返回

-- i/o 多路復用( io multiplexing):select,poll,epoll

-- 訊號驅動 i/o( signal driven io)

-- 非同步 i/o(asynchronous io):python是用協程實現的,單執行緒或者單程序實現多工

大致流程:有master和worker,乙個是發布任務的,後者是工作的

master:

import time, sys, queue, random

from multiprocessing.managers import basemanager

task_queue = queue.queue()

result_queue = queue.queue()

# basemanager直接用就好了

class queuemanager(basemanager):

pass

# 必須得定義成函式來獲取佇列

def task_fun():

return task_queue

def result_fun():

return result_queue

def master_do():

# 註冊在網上的佇列,通過get_task_queue函式名來進行呼叫

queuemanager.register('get_task_queue', callable=task_fun)

queuemanager.register('get_result_queue', callable=result_fun)

manager = queuemanager(address=('127.0.0.1', 20943), authkey=b'hwq')

manager.start()

## 注意一下兩步

task = manager.get_task_queue()

result = manager.get_result_queue()

for i in range(10):

n = random.randint(0, 66)

print("put task {}".format(n))

task.put(n)

print("get results...")

for i in range(10):

r = result.get(timeout=10)

print('result:{}'.format(r))

manager.shutdown()

print('manager shutdown')

if __name__ == '__main__':

master_do()

worker:

import time, sys, queue

from multiprocessing.managers import basemanager

# 下面的這種除非有定製化內容,直接用就好,底層的網路通訊都已經實現好了

class queuemanager(basemanager):

pass

queuemanager.register("get_task_queue")

queuemanager.register("get_result_queue")

server_address = '127.0.0.1'

print('connect to server {}'.format(server_address))

m = queuemanager(address=(server_address, 20943), authkey=b"hwq")

m.connect()

task = m.get_task_queue()

result = m.get_result_queue()

for i in range(10):

try:

n = task.get(timeout=1)

print("run task {}*{}".format(n, n))

r = "{}*{}={}".format(n, n, n*n)

time.sleep(1)

result.put(r)

except exception as e:

print(e)

print("worker exit...")

python 分布式程序

process可以分布到多台機器上,而thread最多只能分布到同一臺機器的多個cpu上。python的multiprocessing模組不但支援多程序,其中managers子模組還支援把多程序分布到多台機器上。乙個服務程序可以作為排程者,將任務分布到其他多個程序中,依靠網路通訊。由於manager...

Python 分布式程序

分布式程序是將process程序分布到多台伺服器中,利用多台機器的效能完成複雜的任務。可以應用到分布式爬蟲的開發中。分布式程序在python中依然要用到multiprocess模組。它不但支援多程序,其中managers子模組還支援吧多程序分不到多台機器上,可以寫乙個服務程序作為排程者,將任務分不到...

python 學習 分布式程序

伺服器端 import random,time,queue from multiprocessing.managers import basemanager 傳送任務的佇列 task queue queue.queue 接收結果的佇列 result queue queue.queue class q...