十五、规则表达式
略----------------------------------------------------------------------------------------------
十六、网络编程
AF_UNIX 基于UNIX文件
AF_INET 基于网络TCP:SOCK_STREAM
UDP:SOCK_DGRAM常见命令socket,bind,listen,accept,connect,recv,send,recvfrom,sendto,close
2个简单的代码
'''tcpserver.py'''
from socket import * #为了获得宏定义 from time import time,ctimeHOST=''
PORT=21567 BUFSIZE=1024 ADDR=(HOST,PORT)tcpss=socket(AF_INET,SOCK_STREAM)
tcpss.bind(ADDR) tcpss.listen(4) #最大允许连接数 sexit=0while 1:
print 'wait' tcpcs,addr=tcpss.accept() print 'from' ,addr while 1: data=tcpcs.recv(BUFSIZE) print data if not data: break tcpcs.send('[%s] %s'%(ctime(time()),data)) if data == 'exit': sexit=1 tcpcs.close() if sexit: break tcpss.close'''tcpclient.py'''
from socket import *
HOST='192.168.1.xxx'
PORT=21567 #服务器端的端口 BUFSIZE=1024 ADDR=(HOST,PORT)tcpcs=socket(AF_INET,SOCK_STREAM)
tcpcs.connect(ADDR)data=raw_input('>')
tcpcs.send(data) data=tcpcs.recv(BUFSIZE) print data tcpcs.close()相关函数:
sendall,getpeername,getsockname,getsockopt,makefile,settimeout,gettimeout,setblocking
fromfd,gethostname,gethostbyname,gethostbyaddr,getservbyname,getprotobyname,ntohl,ntohs,htonl,htons,inet_aton,inet_ntoa,ssl----------------------------------------------------------------------------------------------
十七、多线程建立线程的方法有2种,一是使用模块给于自定义函数,二是继承线程类。
退出线程的方法:执行完成,thread.exit(),sys.exit()获得引发一个SystemError异常。
主进程退出,线程可能会直接死亡不做任何扫尾工作,也可能继续生存,看操作系统而定。
如果使用thread,当主进程运行结束,则子进程不扫尾退出,除非进行加锁。 如果使用继承线程类和threading模块使用函数的方法启动线程,则自动添加锁,线程运行结束,主进程才会退出。thread模块提供对线程和线程锁的基本支持,不推荐使用。
threading提供全功能线程管理功能。 Queue允许用户创建被多个线程共享的队列数据结构。thread模块建立线程的例子:
def loop(a1,a2):pass thread.start_new_thread(loop,(1,2))threading可以使用函数也可以使用类,如使用函数的:
def loop(a1,a2):pass t=threading.Thread(target=loop,args=(1,[1,2])) t.start() t.join() #等待线程的结束,主线程进入阻塞状态,就算没有join,在子线程完成前,主进程执行完了全部代码也不会退出。就算用sys.exit()也不会导致子线程退出,只是sys.exit()的代码将不会执行。如:t.start();print 'end1';sys.exit();print 'end2';
子线程继续运行,只是end2没有打印出来。可以创建类(不是子类)来实现通过调用一个函数启动一个线程。我觉得不如直接使用子类来做。
可以继承threading.Thread子类来实现一个进程,如:
class myt(threading.Thread): def __init__(self): threading.Thread.__init__(self) def __run__(self): pass t=myt() t.start()setDaemon(True)可以在init中设置,必须在start之前用,否则就会抛出异常。如果不设置默认为False。不明白有什么用处,难道是确认初始化里面某些操作是不是成功?
isAlive只有在start以后才会为真,当然线程退出后为假。另外,python不支持杀死线程,这点感觉很麻烦。
Queue模块的方法Queue(size),qsize(),empty(),full(),put(item,block=0),get(block=0)注意实测缺省值不为0
书上写,block非0才会在队伍满的时候阻塞,这里发现为0时同样会阻塞。 继续发现,似乎这里的缺省值并不是0,使用q1.put('a',0)把block=0写入时,就会提示队列已经满了,出现一个叫'Queue.Full'的异常。----------------------------------------------------------------------------------------------
十八、GUI图形界面略