Many concurrent programming thread
What is a thread?
Cpu is run directly, a thread refers to a single control flow sequence, a plurality of parallel processes in the process, each parallel to perform different tasks
如果把操作系统比作一个车间的话,而进程就是一个个车间,线程就是车间里边的一条条流水线,电源就是cpu
The difference between processes and threads
- 线程 :单指代码的执行过程 - 进程:资源的申请与销毁的过程 - 进程内存空间彼此隔离 - 同一进程下的线程可以共享资源 - 进程需要申请资源开辟内存空间 慢 - 线程只是告诉操作系统一个执行方案 快
Why use multithreading
- 多线程共享一个内存空间,节约资源 - 线程比进程更容易创建,在许多操作系统中,创建一个线程比创建一个进程要快10-100倍,在有大量线程需要动态和快速修改时,这一特性很有用 - 若多个线程都是cpu密集型的,那么并不能获得性能上的增强,但是如果存在大量的计算和大量的I/O处理,拥有多个线程允许这些活动彼此重叠运行,从而会加快程序执行的速度。 - 若多个线程都是cpu密集型的,那么并不能获得性能上的增强,但是如果存在大量的计算和大量的I/O处理,拥有多个线程允许这些活动彼此重叠运行,从而会加快程序执行的速度。
Two ways to start a process of
method one
from threading import Thread import time def task(): print("线程开启\n") time.sleep(2) print("线程结束\n") if __name__ == '__main__': t = Thread(target=task) t.start() print("主线程")
Second way
from threading import Thread import time class myt(Thread): def run(self): print("线程开启\n") time.sleep(2) print("线程结束\n") if __name__ == '__main__': t= myt() t.start() print("主进程")
Threads and processes operating speed
from threading import Thread from multiprocessing import Process def task(): print("线程开启") print("线程结束\n") def task1(): print("进程开启") print("进程结束\n") if __name__ == '__main__': t = Thread(target=task) t.start() print("主线程") p = Process(target=task1) p.start() print("主线程")
Threads share memory space
from threading import Thread x = 100 def task(): global x x =50 t = Thread(target=task) t.start() print(x) def task1(): global x x = 2 t1 = Thread(target=task1) t1.start() print(x)
Thread join Usage
from threading import Thread import time def tast(name,time_): print(f"{name} 开启") time.sleep(time_) print(f"{name} 结束") if __name__ == '__main__': t1 = Thread(target=tast,args=('线程1',1)) t2 = Thread(target=tast,args=('线程2',2)) t3 = Thread(target=tast,args=('线程3',3)) start = time.time() t1.start() t2.start() t3.start() t1.join() t2.join() t3.join() end = time.time() print("主线程") print(end-start)
Other thread related methods
print("线程开启\n") time.sleep(2) print("线程结束\n") if __name__ == '__main__': t = Thread(target=task) t.start() # 检测线程是否活动 print(t.is_alive()) #返回线程名字 print(t.getName()) #修改线程名字 t.setName("线程1") print(t.getName()) #返回当前线程变量 print(threading.currentThread()) #返回一个包含正在运行的线程的list。正在运行指线程启动后、结束前,不包括启动前和终止后的线程。 print(threading.enumerate()) # 返回正在运行的线程数量,与len(threading.enumerate())有相同的结果 print(threading.activeCount()) print("主线程")
Daemon
After waiting for the main thread to complete the destruction of the end of the last line of code
from threading import Thread import time def task(): print("这是子线程开始\n") time.sleep(2) print("这是子线程结束") if __name__ == '__main__': t = Thread(target=task) #将线程变成守护线程 t.daemon = True t.start() print("这是主线程")