多工實現方法可以是:多執行緒,多程序,非同步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...