python多线程

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()

 

posted @ 2016-09-29 08:51  河边青青草  阅读(183)  评论(0编辑  收藏  举报