进程与线程
线程是操作系统能够调度的最小单位;
线程就是一堆指令,线程包含在进程中,一个进程可以并发多个线程,每条线程并行执行多个不同任务;
每一个程序的内存是独立,不能互相访问的;
进程:qq要以一个整体的形式暴露给操作系统管理,里面包含对各种资源调用,内存的使用,对各种资源管理的集合就可以成为进程
进程操作cpu,必须要先创建一个线程,进程不具备操作指令的功能,只是一堆指令的集合,一个进程要执行指令至少需要一个线程,进程里的第一个线程就是主线程;
所有在同一个进程里的线程是共享同一块内存空间的;
每一个程序执行的实例就称为一个进程,每一个进程提供执行这个程序所需要的资源;
进程线程区别?
启动一个线程要比启动一个进程快,启动之后不会产生差别;
线程共享内存空间,进程是独立内存空间;
同一个进程的线程之间可以直接交流,两个进程想通信必须通过中间代理来实现;
创建新线程很简单,创建新进程需要对父进程进行一次克隆;
一个线程可以控制操作同一进程内的其他线程,进程只能操作子进程
修改线程是不会对其他线程产生影响的,修改一个进程会对其他造成影响的;
python简单并发
import threading
import time
def run(n):
print("task", n)
time.sleep(2)
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)
time.sleep(2)
start_time = time.time()
t_objs = []
for i in range(50):
t1 = MyThread('t1-%s' %i)
t1.start()
t_objs.append(t1)
for t in t_objs:
#等待线程
t.join()
#打印程序执行的时间
print(time.time()-start_time)
守护线程
GIL锁
python线程调用系统的原生线程
sleep不占用cpu
events
是不同线程之间同步的对象
enent = threading.Event()
event.wait() #等待标志位被设定
event.set() #设置标志位
event.clear() #清空标志位
举例:
import time
import threading
event = threading.Event()
def lighter():
count = 0
event.set()
while True:
if count >5 and count < 10:
event.clear()
print('red')
elif count > 11:
event.set()
count = 0
else:
print('绿灯')
time.sleep(1)
count += 1
def car(name):
while True:
if event.is_set():
print('%s 车辆通行'%name)
time.sleep(1)
else:
print('%s 等待绿灯'%name)
event.wait()
print('车辆启动')
car_go = threading.Thread(target=car, args=('Jait',))
car_go.start()
li = threading.Thread(target=lighter,)
li.start()
队列作用:
1. 程序间解耦 2. 提高运行效率
队列就是有顺序的容器
多线程:
python多线程不适合cpu密集型操作任务,适合io操作密集的任务
多进程之间数据是无法正常通信的