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