python網路程式設計之程序池
阿新 • • 發佈:2018-12-18
一、Socket簡介
socket通常也稱作"套接字",用於描述IP地址和埠,是一個通訊鏈的控制代碼,應用程式通常通過"套接字"向網路發出請求或者應答網路請求。
socket起源於Unix,而Unix/Linux基本哲學之一就是“一切皆檔案”,對於檔案用【開啟】【讀寫】【關閉】模式來操作。socket就是該模式的一個實現,socket即是一種特殊的檔案,一些socket函式就是對其進行的操作(讀/寫IO、開啟、關閉)
socket和file的區別:
file模組是針對某個指定檔案進行【開啟】【讀寫】【關閉】
socket模組是針對 伺服器端 和 客戶端Socket 進行【開啟】【讀寫】【關閉】
socket server
#!/usr/bin/env python # -*- coding:utf-8 -*- import socket ip_port = ('127.0.0.1',9999) sk = socket.socket() sk.bind(ip_port) sk.listen(5) while True: print 'server waiting...' conn,addr = sk.accept() client_data = conn.recv(1024) print client_data conn.sendall('不要回答,不要回答,不要回答') conn.close()
socket client
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import socket
ip_port = ('127.0.0.1',9999)
sk = socket.socket()
sk.connect(ip_port)
sk.sendall('請求佔領地球')
server_reply = sk.recv(1024)
print server_reply
sk.close()
web伺服器應用
#!/usr/bin/env python #coding:utf-8 import socket def handle_request(client): buf = client.recv(1024) client.send("HTTP/1.1 200 OK\r\n\r\n") client.send("Hello, World") def main(): sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.bind(('localhost',8080)) sock.listen(5) while True: connection, address = sock.accept() handle_request(connection) connection.close() if __name__ == '__main__': main()
二、多程序
1、Pool使用簡介
有些情況下,所要完成的工作可以分解並獨立地分佈到多個工作程序,對於這種簡單的情況,可以用Pool類來管理固定數目的工作程序。
示例一:
#!/usr/bin/env python
#-*- coding:utf-8 -*-
import time
from multiprocessing import Pool
def run(fn):
time.sleep(1)
print(fn*fn)
if __name__ == '__main__':
testFL = [1,2,3,4,5,6]
print('順序執行或者叫做序列執行,也叫單程序')
s = time.time()
for i in testFL:
run(i)
t1 = time.time()
print('順序執行時間:',int(t1-s))
#===============
print('建立多個程序,並行執行')
pool = Pool(6) #建立擁有6個程序數量的程序池
pool.map(run,testFL) #testFL:要處理的資料列表,run:處理testFL列表中的資料函式
pool.close() #關閉程序池,不再接受新的程序
pool.join() #主程序阻塞等待子程序的退出
t2 = time.time()
print('並行執行時間:',int(t2-t1))
示例二:
#!/usr/bin/env python
#-*- coding:utf-8 -*-
import time
from datetime import datetime
from multiprocessing.dummy import Pool as ThreadPool
def add(x, y):
print(datetime.now(), "enter add func...")
time.sleep(2)
print(datetime.now(), "leave add func...")
return x+y
def add_wrap(args):
return add(*args)
if __name__ == "__main__":
pool = ThreadPool(4) # 池的大小為4
print(pool.map(add_wrap, [(1,2),(3,4),(5,6)]))
#close the pool and wait for the worker to exit
pool.close()
pool.join()
備註:池完成其所分配的任務時,即使沒有更多的工作要做,也會重新啟動工作程序。
2、程序執行結果
#!/usr/bin/env python
#-*- coding:utf-8 -*-
from multiprocessing import Pool
import time
def func(msg):
for i in range(3):
print(msg)
time.sleep(1)
return "done " + msg
if __name__ == "__main__":
pool = Pool(processes=4)
result = []
for i in range(10):
msg = "hello %d" %(i)
result.append(pool.apply_async(func, (msg,)))
pool.close()
pool.join()
for res in result:
print(res.get())
print("Sub-process(es) done.")