进程:对各种资源管理的集合。
QQ 要以一个整体的形式暴露给操作系统管理,里面包含对各种资源的调用,内存的管理,网络接口的调用等。
线程:是操作系统最小的调度单位,是一串指令的集合
进程 要操作CPU,必须要先创建一个线程,
进程与线程的区别:
线程共享内存空间,进程的内存是独立的
同一个进程的线程之间可以直接交流,两个进程想通信,必须通过一个中间代理来实现
创建新线程很简单,创建新进程需要对其父进程进行一次克隆
一个线程可以控制和操作同一个进程里的其他线程,但是进程只能操作子进程
并发的多线程效果演示:
import threading import time def run(n): print("task",n) time.sleep(5) t1 = threading.Thread(target=run,args=("t1",)) t2 = threading.Thread(target=run,args=("t2",)) t1.start() t2.start()
import threading import time class MyThread(threading.Thread): def __init__(self,n): super(MyThread,self).__init__() self.n = n def run(self): print("runnint task",self.n) t1 = MyThread("t1") t2 = MyThread("t2") t1.start() t2.start()
启50个线程,最后所有都启动后一共用多少时间:
import threading import time def run(n): print("task",n) time.sleep(5) stat_time = time.time() t_objs = [] #存线程实例 for i in range(50): t = threading.Thread(target=run,args=("t-%s" %i,)) t.start() t_objs.append(t) #为了不阻塞后面线程的启动,不在这里join,先放到一个列表里 for t in t_objs: #循环线程实例列表,等待所有线程执行完毕 t.join() print("-------all threads has finished...") print("cost:",time.time()- stat_time)
守护线程:
import threading import time def run(n): print("task",n) time.sleep(5) stat_time = time.time() t_objs = [] for i in range(50): t = threading.Thread(target=run,args=("t-%s" %i,)) t.setDaemon(True) #把当前线程设置为守护线程 t.start() t_objs.append(t) # for t in t_objs: # t.join() print("-------all threads has finished...") print("cost:",time.time()- stat_time)
问题:无论你有多少核,同一时间只能执行一个线程