47_并发编程-线程python实现

一、Threading模块
 
  1、线程的创建 - 方式一
 1 from threading import Thread
 2 import time
 3 
 4 def sayhi(name):
 5     time.sleep(2)
 6     print('%s say hello' % name)
 7 
 8 if __name__ == '__main__':
 9     t = Thread(target=sayhi, args=('太白',))
10     t.start()  # 线程一启动,就很快的执行完毕了
11     print('主线程结束')
View Code

  2、线程创建 - 方式二

 1 import time
 2 from threading import Thread
 3 
 4 class Sayhi(Thread):
 5     def __init__(self, name):
 6         super().__init__()   # 需要传参数的话需要调取父类__init__()
 7         self.name = name
 8 
 9     def run(self):    # 必须重写run方法
10         time.sleep(2)
11         print('%s say hello' % self.name)
12 
13 if __name__ == '__main__':
14     t = Sayhi('太白')    # 创建对象,传入name
15     t.start()
16     print('主线程')
View Code
   3、多线程与多进程
  进程:导入的模块、执行的python文件的文件所在位置、内置的函数、文件里面的这些代码、全局变量等等,然后线程里面有自己的堆栈(类似于一个列表,后进先出)和寄存器,里面存着自己线程的变量,操作(add)等等,占用的空间很小。
 
 1 from threading import Thread
 2 from multiprocessing import Process
 3 import os
 4 
 5 def work():
 6     print('hello',os.getpid())
 7 
 8 if __name__ == '__main__':
 9     #part1:在主进程下开启多个线程,每个线程都跟主进程的pid一样
10     t1=Thread(target=work)
11     t2=Thread(target=work)
12     t1.start()
13     t2.start()
14     print('主线程/主进程pid',os.getpid())
15 
16     #part2:开多个进程,每个进程都有不同的pid
17     p1=Process(target=work)
18     p2=Process(target=work)
19     p1.start()
20     p2.start()
21     print('主线程/主进程pid',os.getpid())
View Code
 1 import time
 2 from multiprocessing import Process
 3 from threading import Thread
 4 
 5 def func(i):
 6      print(i**2)
 7 
 8 if __name__ == '__main__':
 9 
10     # 线程执行
11     t_s_t = time.time()
12     t_lst = []
13     for i in range(10):
14         t = Thread(target=func, args=(i,))
15         t.start()
16         t_lst.append(t)
17     [ot.join() for ot in t_lst]
18     t_e_t = time.time()
19     t_dif = t_e_t - t_s_t   # 时间差
20 
21     # 进程执行
22     p_s_t = time.time()
23     p_lst = []
24     for i in range(10):
25         p = Process(target=func, args=(i,))
26         p.start()
27         t_lst.append(p)
28     [op.join() for op in t_lst]
29     p_e_t = time.time()
30     p_dif = p_e_t - p_s_t   # 时间差
31 
32     print('线程>>>', t_dif)
33     print('进程>>>', p_dif)
进程线程效率对比

二、Thread/threading其他方法

  1、Thread
      isAlive(): 返回线程是否活动的。
      etName(): 返回线程名。
      setName(): 设置线程名。
      join()
 
  2、threading
      threading.currentThread(): 返回当前的线程变量。
      threading.enumerate(): 返回一个包含正在运行的线程的list。正在运行指线程启动后、结束前,不包括启动前和终止后的线程。
      threading.activeCount(): 返回正在运行的线程数量,与len(threading.enumerate())有相同的结果
 
三、多线程实现socket多人聊天
 
 1 import multiprocessing
 2 import threading
 3 
 4 import socket
 5 s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
 6 s.bind(('127.0.0.1',8080))
 7 s.listen(5)
 8 
 9 def action(conn):
10     while True:
11         data=conn.recv(1024)
12         print(data)
13         msg = input('服务端输入:') #在多线程里面可以使用input输入内容,那么就可以实现客户端和服务端的聊天了,多进程不能输入
14         conn.send(bytes(msg,encoding='utf-8'))
15 
16 if __name__ == '__main__':
17 
18     while True:
19         conn,addr=s.accept()
20         p=threading.Thread(target=action,args=(conn,))
21         p.start()
22 
23 tcp_server.py
服务端
 1 import socket
 2 
 3 s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
 4 s.connect(('127.0.0.1',8080))
 5 
 6 while True:
 7     msg=input('>>: ').strip()
 8     if not msg:continue
 9 
10     s.send(msg.encode('utf-8'))
11     data=s.recv(1024)
12     print(data)
13 
14 tcp_client.py
客户端

 

posted @ 2018-10-26 19:43  qi.hu  阅读(167)  评论(0编辑  收藏  举报