参考链接: https://www.cnblogs.com/Eva-J/articles/8306047.html
threading
单线程
import time from threading import Thread def func(n): time.sleep(1) print(n) if __name__ == "__main__": # 创建一个子线程 t = Thread(target=func, args=(1,)) t.start()
多线程
主线程会等子线程执行完毕后再结束
import time from threading import Thread # 多线程并发 def func(n): time.sleep(5) print('我是子线程',n) for i in range(10): # 主线程会等子线程执行完毕后再结束 t = Thread(target=func, args=(i,)) t.start() print('我是主线程')
类方法使用线程
import time from threading import Thread # 多线程并发 class MyTread(Thread): # 要使用新属性时需要调用父类的init def __init__(self,args): super().__init__() self.args = args # 一定要创建一个类方法 def run(self): time.sleep(1) print(self.args) t = MyTread(10) t.start()
ps:
#进程是最小的内存分配单位。
#线程是 操作系统调度的最小单位。
#线程被CPU执行了。
#进程内至少含有一个线程。
#进程中可以开启多个线程。
#开启一个线程所需要的时间要远远小于开启一个进程。
#多个线程内部有自己的数据栈,数据不共享。
#全局变量在多个线程之间是共享的。
#在Cpython解释器下的python程序 在同一时刻 多个线程中只能有一个线程被CPU执行。GIL锁(全局解释器锁)
#高CPU :计算类——高CPU利用率。
#高IO :爬取网页 200个网页
#qq聊天 send recv 处理日志文件 读文件 处理web请求 读数据库
全局变量在多线程中是共享的
import time import os from threading import Thread # 多线程并发 def func(a, b): global g g = 0 n = a + b # 调用这个子线程之后,由于他声明了全部变量 所以这个g = 0 g = 100 lst = [] for i in range(1): # 开启一个子线程 t = Thread(target=func, args=(i, 5)) t.start() # 我这里只是为了取一个循环次数 lst.append(t) for t in lst: # 等子线程 执行完之后再执行 主线程 t.join() #全局变量在线程之间是共享的 print('主线程', g)
多进程和多线程时间对比
这差距不是一般的大呀!!!!
线程socket:可以连接多个client
client
线程模块中的其他方法
# 查看当前活跃线程数加上主线程 #10 +
print(threading.active_count())
# 查看是否属于主线程还是子线程
print(threading.current_thread())
# 显示所有线程名和id
print(threading.enumerate())
# get_ident 是查看线程id
print(threading.get_ident())
import time import os from threading import Thread import threading # 多线程并发 def func(n): time.sleep(0.5) # 查看是否属于主线程还是子线程 print(i,threading.current_thread()) # get_ident 是查看线程id print(threading.get_ident()) for i in range(10): t = threading.Thread(target=func,args=(i,)) t.start() # 查看当前活跃线程数加上主线程 #10 + print(threading.active_count()) # 查看是否属于主线程还是子线程 print(threading.current_thread()) # 显示所有线程名和id print(threading.enumerate())
守护线程
#守护进程随着主线程程代码的执行结束而结束。
#守护线程会在主线程执行完之后等待其他子线程的结束才结束。
#主线程在执行完自己的代码之后不会立即结束 而是等待子线程结束之后 回收子线程的资源。
import time from threading import Thread def func1(): while 1 : time.sleep(1) print("