二十七、Python 进程和线程(一) 线程和进程的关系以及线程常见方法
Python 的进程和线程概述
1:线程属于进程。创建所有的对象包括方法、变量等均放置到进程中。线程在执行中,在去进程中获取资源使用。
线程运行在进程空间内。同一个进程所产生的线程共享同一个内存空间。当进程退出的时候,改进程产生的线程会被强制结束。
2:同一个进程的线程共享一个内存空间和其他资源。
3:不同线程之间不同资源:计数器、堆栈、寄存器
4:进程
优点:同时利用多个CPU,能够同时进行多个操作。
缺点: 消耗资源(重新开辟内存空间)
线程
优点:共享内存,IO 操作的时候,创造并发操作。
(在其他语言中,一个进程 中不同线程可以同时操作CPU。Python中一个进程中全局解释器锁的机制-GIL,使得Python中只能有一个线程操作CPU,但是可以同时操作IO, 所以不适用于计算密集型,适用于IO密级型)
缺点: 资源抢占。(多个线程针对同一个内容进行操作)
5:
进程不是越多越好, CPU个数= 进程个数
线程也不是越多越好,具体案例具体分析,请求上下文(记录每一个线程的操作情况)比较消耗资源。
6:单线程、单进程 就是主线程、主进程
7: 计算机中执行任务的最小单元是线程。
8: 通过主进程创建子进程。通过主线程创建子线程。
threading.Thread 常用的方法
threadming 模块是在_thread模块之上建立的。 thread 模块是以低级、原始的方式来处理和控制线程。 threading 是对thread的二次封装。 提供了更便利的API来处理线程。
两种方式执行线程
1:建立子类继承threadming.thread
在子类中,重写run 方法。在run 中实现 执行逻辑。 这样在子类线程实例化后, start()后,将自动调用run()方法。
1 import threading 2 import time 3 4 class MyThread(threading.Thread): 5 def __init__(self, id): 6 threading.Thread.__init__(self) 7 self.id = id 8 9 def run(self): 10 x = 0 11 time.sleep(10) 12 print(self.id) 13 14 if __name__ == "__main__": 15 t1 = MyThread(999) 16 t1.start() 17 for i in range(5): 18 print(i) 19 20 21 22 C:\Python35\python.exe D:/Python0618/homework/day10/a.py 23 0 24 1 25 2 26 3 27 4 28 999
2:将可执行对象传递给thread的target
target将对象传递给 thread 的 run 方法。 在threading.thread(target = xxx)
1 #!/usr/bin/evn python 2 #-*- coding:utf-8 -*- 3 import threading 4 import time 5 6 def worker(num): 7 """ 8 thread worker function 9 :return: 10 """ 11 time.sleep(1) 12 print("Thread %d" % num) 13 return 14 15 for i in range(20): 16 t = threading.Thread(target=worker, args=(i,),name ="t. % d" % i) 17 t.start()
3:常见方法
def __init__(self, group=None, target=None, name=None, args=(), kwargs=None, *, daemon=None): """This constructor should always be called with keyword arguments. Arguments are: *group* should be None; reserved for future extension when a ThreadGroup class is implemented. *target* 被 run() 执行的可以调用的对象 method. Defaults to None, meaning nothing is called. *name* 线程名称 *args* 传递给target的参数 *kwargs* 传递给target的参数 如果建立子类,重写构造方法。格式: def __init__(self, xxx): threading.Thread.__init__(self) self.id = id """ def start(self):
""" 激活线程""" def run(self):
"""将可调用的方法传递给thread的构造方法的target。然后通过run()去执行此方法。 可以在子类中重写run 方法。建立子类的对象收,start后会自动调用子类的run 方法。 """ def join(self, timeout=None): """ 阻塞主线程,等待子线程逐个执行完毕,一个一个执行结束后,在继续向下执行。 如果设置timeout表示最多设置 N 秒,如果执行了m秒,m <n, 则执行m 秒后继续,在超时后,不论子线程是否执行完毕,均向下执行"""
def name(self): """ 获取线程的名称 return self._name""" def is_alive(self): """ 判断线程是否alive""" def isDaemon(self): return self.daemon """判断是否是后台进程。""" def setDaemon(self, daemonic): """ 设置为后台进程。 如果A线程调用了B.setDaemon 是将B 设置为后台线程。不设置则默认为用户线程(默认值False)。 必须在start前设置。 如果是主进程线程执行完毕,后台进程(子线程)无论是否成功均停止。 如果用户线程,则等待子线程执行完毕在结束。""" def getName(self): """得到线程名称""" return self.name def setName(self, name): """设置线程名称""" self.name = name ident """线程标识符号。 线程标识符号是一个非0整数。在调用了start 之后才能生效否则只返回None""" def ident(self): """线程标识符号。 线程标识符号是一个非0整数。在调用了start 之后才能生效否则只返回None""" return self._ident

浙公网安备 33010602011771号