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

收藏 打印