python_并发编程——多线程
Posted 手可摘星辰。
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python_并发编程——多线程相关的知识,希望对你有一定的参考价值。
1.多线程并发
from threading import Thread import time def func(n): time.sleep(1) print(n) for i in range(10): t = Thread(target=func,args=(i,)) #将函数注册进子线程,并传递参数 t.start() #启动子线程
结果:
2.另外一种启动多线程的方法
from threading import Thread import time class MyTread(Thread): def __init__(self,arg): #接收参数 super().__init__() self.arg = arg def run(self): #子线程要执行的内容 time.sleep(1) print(self.arg) for i in range(10): t = MyTread(i) #实例化子线程+传递参数 t.start() #启动子线程
结果:
3.查看多线程是否都在同一个进程里面
from threading import Thread import time import os class MyTread(Thread): def __init__(self,arg): #接收参数 super().__init__() self.arg = arg def run(self): #子线程要执行的内容 time.sleep(1) print(self.arg,os.getpid()) for i in range(10): t = MyTread(i) #实例化子线程+传递参数 t.start() #启动子线程 print(\'主线程:\',os.getpid())
结果: 相同的进程编号,说明所有的线程都在同一个进程里面。
4.线程之间数据共享
from threading import Thread import time ggg = 100 def func(n): time.sleep(1) global ggg ggg = 0 print(\'子线程:\',n) t_list = [] for i in range(10): t = Thread(target=func,args=(i,)) t.start() t_list.append(t) for i in t_list: i.join() print(\'主线程:\',ggg)
结果: 全局变量ggg本来是100,在子线程中被改成了0。
5.查看线程名字和线程ID
import threading def func(n): print(n) #打印线程名字和ID print(threading.current_thread()) #打印线程ID print(threading.get_ident()) threading.Thread(target=func,args=(1,)).start() print(threading.current_thread())
结果:
6.查看当前存活的线程数量和线程对象
import threading import time def func(n): time.sleep(1) print(threading.current_thread()) for i in range(10): threading.Thread(target=func,args=(i,)).start() #查看当前存活的线程数量 print(threading.active_count()) #查看当前存活的线程对象 print(threading.enumerate())
结果:
7.守护线程
import time from threading import Thread def func1(): time.sleep(10) print(\'子线程!\') t = Thread(target=func1) t.start() print(\'主线程!\')
结果:主线程会等待10秒后,子线程结束时在结束。
import time from threading import Thread def func1(): time.sleep(10) print(\'子线程!\') t = Thread(target=func1) t.daemon = True #将子线程设为守护线程 t.start() print(\'主线程!\')
结果:当只有一个守护线程时,主线程结束时,守护线程随即结束。
import time from threading import Thread def func1(): while True: print(\'*\'*10) time.sleep(1) def func2(): time.sleep(5) print(\'func2结束!\') t1 = Thread(target=func1) t1.daemon = True #将子线程设为守护线程 t1.start() t2 = Thread(target=func2) t2.start() print(\'主线程!\')
结果:守护线程和守护进程不一样,守护进程随着主进程的代码的执行结束而结束,守护线程会在主线程结束之后等待其他子线程的结束才结束。
8.join()方法
import time from threading import Thread def func1(): while True: print(\'*\'*10) time.sleep(1) def func2(): time.sleep(5) print(\'func2结束!\') t1 = Thread(target=func1) t1.daemon = True #将子线程设为守护线程 t1.start() t2 = Thread(target=func2) t2.start() t2.join() #先阻塞主线程,专注于执行子线程,等子线程执行完毕后,在执行主线程 print(\'主线程!\')
结果:
以上是关于python_并发编程——多线程的主要内容,如果未能解决你的问题,请参考以下文章