zoukankan      html  css  js  c++  java
  • 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
    客户端

     

  • 相关阅读:
    NoSuchElementException if input is exhausted 报错
    批量更改文件后缀名
    初识Java
    简单cmd
    电脑操作简易快捷键
    java学习 Markdown+开始写博客
    JavaScript基础知识
    当数位数不够这,前面补0
    vs code 设置
    json日期格式转换为 2019-11-27 格式
  • 原文地址:https://www.cnblogs.com/hq82/p/9858346.html
Copyright © 2011-2022 走看看