zoukankan      html  css  js  c++  java
  • 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()
  • 相关阅读:
    Hibernate性能优化之EHCache缓存
    Hibernate性能优化之SessionFactory重用
    用 NetBeans 快速开发 Java JAX-RS RESTful 服务
    Linux iptables:场景实战一
    Linux iptables:规则组成
    Linux iptables:规则原理和基础
    Linux安全之SYN攻击原理及处理
    Linux常用网络工具:批量主机服务扫描之netcat
    Linux常用网络工具:批量主机服务扫描之nmap
    Linux常用网络工具:路由扫描之mtr
  • 原文地址:https://www.cnblogs.com/fengyunlsm/p/5910710.html
Copyright © 2011-2022 走看看