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
    客户端

     

  • 相关阅读:
    SAP Spartacus 自定义Popover指令,如何实现弹出对话框自动关闭功能
    SAP Spartacus B2B 页面信息提示图标的弹出窗口显示实现逻辑
    一个好用的 SAP UI5 本地打包(build)工具,自动生成Component-preload.js
    什么是 SAP UI5 的 Component-preload.js, 什么是Minification和Ugification
    云小课 | 一个三分钟快速定制OCR应用的神器,要不?
    JavaScript实现:如何写出漂亮的条件表达式
    想做测试工程师,这7件事你必须先知道
    比物理线程都好用的C++20的协程,你会用吗?
    解读 SSDB、LevelDB 和 RocksDB 到 GaussDB(for Redis) 的迁移
    数据中心太耗电,送你一个节能神器
  • 原文地址:https://www.cnblogs.com/hq82/p/9858346.html
Copyright © 2011-2022 走看看