十五、规则表达式
略
----------------------------------------------------------------------------------------------
十六、网络编程
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,ctime
HOST=‘‘
PORT=21567
BUFSIZE=1024
ADDR=(HOST,PORT)
tcpss=socket(AF_INET,SOCK_STREAM)
tcpss.bind(ADDR)
tcpss.listen(4) #最大允许连接数
sexit=0
while 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图形界面
略