十五、规则表达式

----------------------------------------------------------------------------------------------

十六、网络编程

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图形界面