奇迹969

 

进程与线程

 

 

 

  1、进程

 

进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位。每个进程都有自己的独立内存空间,不同进程通过进程间通信来通信。由于进程比较重量,占据独立的内存,所以上下文进程间的切换开销(栈、寄存器、虚拟内存、文件句柄等)比较大,但相对比较稳定安全。

 

  2、线程

 

线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源。线程间通信主要通过共享内存,上下文切换很快,资源开销较少,但相比进程不够稳定容易丢失数据。

 

  3、协程

 

协程是一种用户态的轻量级线程,协程的调度完全由用户控制。协程拥有自己的寄存器上下文和栈。协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈,直接操作栈则基本没有内核切换的开销,可以不加锁的访问全局变量,所以上下文的切换非常快。

 

 

 

 

进程:本质上就是程序的与性过程(抽象的)。

线程:是计算机中能被CPU调度的最小单位。

进程:最小的资源单位。

进程控制块用来记录进程的外部特征,描述进程的执行变化过程,系统可以利用它开控制和管理进程,他是系统感知进程的唯一标志。

 

CPU执行相应指令 从内存中把数据拿过来运行(程序在内存中运行)

 

 

 

1.一个程序至少有一个进程,一个进程至少有一个线程。

2.进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序运行的效率。

3.线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口,顺序执行序列和程序的出口。但是线程不能够独立执行,必须已存在应用程序中,由应用程序提供多个线程执行控制。

4.进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个单位。

5,。一个线程可以创建和撤销另一个线程,同一个进程之间多个线程可以并发执行。

 

 (注意 join不能与主线程和主进程结合)

线程守护和进程守护的相同点与区别

相同点:_ .daemon = True 或__.set.daemon(True )    都在__.start()之前写

不同点:

守护线程:守护主线程和子线程全部完成。 如果把子线程设为守护线程 那么子线程会与主线程一起推出(主线程运行时间比子线程运行时间小)。

守护进程:守护主进程代码全部完成(可以用.join来延迟)

#进程会随主线程的结束而结束。

1.主线程会等待子线程的结束而结束
2.守护线程会随着主线程的结束而结束守护线程会守护主线程和所有的子线程
3.进程会随着主线程的结束而结束
其他方法(实例化的方法 )
run():用以表示线程或进程活动的方法
start():启动线程或进程。(start()是线程处于就绪状态等待cpu调用。)
isalive() : 返回线程或进程是否活动(True,False)
getName() :返回线程或进程名。
setName() :设置线程或进程名。
threading 模块提供的一些方法:(threading模块的方法  注意与上面的区别)
threading.currentThread():返回当前线程变量。
threading.enumerate() : 放回一个正在运行的线程的list,正在运行指线程启动后,结束前,不包括启动前和终止后的线程。
threading.activeCount():返回正在运行的线程的数量,与len(threading.enumrate())的结果相同。
 
 
面向对象的写法
必须用 用 def    run(self):
里面写内容   名字不能更改。
 
 
 
Semaphore(num)    #(锁的一种)
def run(self):
   if semaphore.acquire(
           ........
           time.sleep(3)
     semaphore.release()
 
 
from threading import Thread
semaphore = threading.Semaphor( num )  默认为1个
 
同时开num个信号量。(也是一种锁需要acquire 和release)
semaphore 作用:
如果在主机执行IO密集型任务的时候再执行这种类型的程序时,计算机就有很大可能会宕机。这时候就可以为这段程序添加一个计数器功能,来限制一个时间点内的线程数量。
 
 
 
 
进程与线程 队列
 
from queue import  Queue ,PriorityQueue,LifoQueue
q = Queue( num )   可以放num个数据(如果q.put num++个数据 会处于等待阻塞状态    q.put()也会等待阻塞)
q.put('  ' ,False)   如果放入超过队列长度会报错,True的话会卡住
 
q.get() 同上
 
 
也可以 q = Queue(maxsize=num )  队列长度最大为num
from queue import PriorityQueue # 优先级队列 #也可以 import queue     queue.Queue()    
pq = PriorityQueue()
pq.put((10,'askdhiu'))
pq.put((2,'asljlg'))
pq.put((20,'asljlg'))
print(pq.get())
print(pq.get())
print(pq.get())

#数字越小 优先级越高

queue (方法 put ()    get()   q.size()#队列有多少值     q.empty()  q.full()返回         false 或   true    q.get_nowait(item) 相当于 q.put(item ,False)  q.get_nowait()相当于q.get(False),q.task_done()在完成一项工作后 ,q.task_done()向队列发送一个信号   由 q.join()接受。

1.默认FIFO(先进先出)from  queue import Queue

2.先进后出  from  queue import LifoQueue
3.优先级队列  from queue import PriorityQueue  
 
 
进程 线程 池
from concurrent.futures  import   ProcessPoolExecutor
from concurrent.futires  import   ThreadPoolExecutor
 
submit :   for i in range(100)#可迭代:  ret = p/t.submit(函数名,i)    每一个都是一个对象   需要用 ret.result()
map  :   ret  =  p/t. map(函数名,可迭代对象)     ret为一个生成器     (注意  与submit的区别   ) 
shutdown  :.p/t.shutdown()      阻塞 直到池中的任务全部完成。

posted on 2019-04-18 15:39  奇迹969  阅读(115)  评论(0编辑  收藏  举报

导航