1. 程式人生 > >python網路程式設計之程序池

python網路程式設計之程序池

一、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.")