1.什么是进程
从某个时间点到某个时间点一次性做完所有事情。
程序的一次执行
2.什么是线程
来回地切换做某一件事情,而这件事请的所占的时间,空间称为线程,所有的线程都在一个进程当中。
譬如:就好像我们做某一件事情卡住了,就停下来去做另外一件事情,等到有空的时候再去做这件事请。
3.什么情况下使用多线程
阻塞,多件事情同时发生
4.如何定义,调用,开始多线程程序以及使用生产---消费模型
定义需要同时发生的线程
调用,开始<python核心编程>参考手册
生产消费模型:线程之间通讯
服务器端
1 #!/usr/bin/env python 2 # -*- coding: utf-8 -*- 3 """ 4 创建TCP客户端 5 """ 6 from socket import * 7 import threading 8 from Queue import Queue 9 import re 10 11 host = '' # 主机 是不是随意决定的(是的) 12 port = 21567 # 端口号 是不是随意决定的(是的) 13 bufsize = 1024 14 addr = (host, port) 15 16 tcpsersock = socket(AF_INET, SOCK_STREAM) # 创建服务器套接字 17 tcpsersock.bind(addr) # 把地址绑定到套接字上 18 tcpsersock.listen(5) # 监听连接(表示最多允许多少个同时连接) 19 20 21 def tcp_ser_get(i, get_queue, rec_queue): 22 """ 23 函数说明:如果rev_queue不为空,则将数据保存到q2对象当中 24 参数 i: 25 参数 get_queue: 26 返回值: 27 """ 28 29 global tcpclisock # 定义全局变量 30 tcpclisock = [None] * 6 31 32 33 def accept(): 34 while True: 35 for i in range(6): 36 print (u"服务器开始监听连接....") 37 tcpclisock_temp, addr = tcpsersock.accept() # 接受服务器连接, 估计是要多线程(如何创建多个tcpclisock) 38 tcpclisock[i] = tcpclisock_temp 39 print(u'用户{0}已成功连接...'.format(i+1)) 40 41 42 def tcp_ser_get_get(): 43 while True: 44 if not rec_queue.empty(): 45 val = rec_queue.get(1) 46 print (u'发送的数据为{0}'.format(val)) 47 if re.match('customer1', val): 48 tcpclisock[1].send(val) 49 else: 50 tcpclisock[0].send(val) 51 52 53 54 def tcp_ser_get_recv1(): 55 """客户端1获取数据 56 返回值: 57 """ 58 while True: 59 if tcpclisock[0] is not None: 60 data = tcpclisock[0].recv(bufsize) # 卡在这里了(难道非多线程不可) 61 if data: 62 rec_queue.put(data, 1) 63 print(u'接收数据为{0}'.format(data)) 64 65 66 def tcp_ser_get_recv2(): 67 """客户端2获取数据 68 返回值: 69 """ 70 while True: 71 if tcpclisock[1] is not None: 72 data = tcpclisock[1].recv(bufsize) # 卡在这里了(难道非多线程不可) 73 if data: 74 rec_queue.put(data, 1) 75 print(u'接收数据为{0}'.format(data)) 76 77 78 79 80 threads = [] 81 func = [accept, tcp_ser_get_get, tcp_ser_get_recv1, tcp_ser_get_recv2] 82 for i in range(len(func)): 83 t = threading.Thread(target=func[i]) 84 threads.append(t) 85 for j in range(len(func)): 86 threads[j].start() 87 for k in range(len(func)): 88 threads[k].join() 89 90 tcpsersock.close() # 服务器关闭(不会被执行) 91 92 93 def main(): 94 q1 = Queue(32) 95 q2 = Queue(32) 96 tcp_ser_get(1, q1, q2) 97 98 99 if __name__ == '__main__': 100 main()
客户端
1 #!/usr/bin/env python 2 # -*- coding: utf-8 -*- 3 """ 4 创建tcp客户端 5 """ 6 from socket import * 7 import threading 8 9 10 def tcp_cli(): 11 """发送数据,接收数据 12 函数说明: 如果bufsize里面存有数据,就取出来,并显示和等待输入;否则,继续;终止条件是 13 线程处理:显示和输入(创建线程(定义函数),开始线程(在什么位置开始线程)) 14 返回值: 15 """ 16 host = 'localhost' # 192.168.1.3 17 port = 21567 # 必须和服务器的端口一样 18 bufsize = 1024 # 缓存 19 addr = (host, port) 20 21 tcpclisock = socket(AF_INET, SOCK_STREAM) # 创建客户端套接字 22 tcpclisock.connect(addr) # 连接服务器 23 24 def recv(): 25 """接受服务器发送的数据 26 函数说明:没有结束条件 27 返回值: 28 """ 29 while True: 30 data = tcpclisock.recv(bufsize) # 一直等待接受 31 print (data) 32 print(u"接收数据断开...") 33 tcpclisock.close() 34 35 36 def send(): 37 """发送输入的数据 38 返回值: 39 """ 40 while True: 41 data = raw_input('>') 42 data = ''.join(['customer1:', data]) 43 tcpclisock.send(data) 44 tcpclisock.close() 45 46 func = [recv, send] 47 threads = [] 48 for i in range(len(func)): 49 t = threading.Thread(target=func[i]) 50 threads.append(t) 51 for j in range(len(func)): 52 threads[j].start() 53 54 55 56 57 def main(): 58 tcp_cli() 59 60 61 if __name__ == '__main__': 62 main()