day10进程、异步IO、

线程 内存共享

线程同时修改同一份数据时必须加锁,mutex互斥锁

递归锁

def fun(n):

  code

t = threading.Thread(target=run,args=(n,))

t.start()

t.join()#必须要等待线程执行完才能往下执行

守护线程t.setDaemon()必须在start()上定义,主线程不必等待守护线程的结束

io操作不占用CPU ,计算操作占用CPU

python多线程其实是单核操作:不适合CPU密集操作型的任务,适合IO操作密集型的任务。

进程之间互访数据multiprocessing.Process(target = f,args = (q,):

通过multiprocessing.Queue()共享:其实是在子进程中克隆一份queue,然后通过pickle序列化实现两个queue之间的通信,该过程直接通过python底层实现,无需用户操作。

管道:parent_conn, child_conn = multiprocessing.Pipe(); p = multiprocessing.Process(target=f,args=child_conn,)) 通过parent_conn, child_conn的send和recv来传递数据。

以上两个都是传递数据。

通过Manager可以实现真正的数据共享。

进程锁

进程池:multiprocessing.Pool()。可以定义进程池可执行进程数量。最后pool.close(); pool.join().

协程:微线程,是一种用户态的轻量级线程,CPU根本不知道。协程拥有自己的寄存器上下文和栈。。。

协程的好处:1、无需线程上下文切换的开销;2、无需原子操作锁定及同步的开销;方便切换控制流,简化编程模型;高并发、高扩展、低成本。 缺点:无法利用多核资源,

需要导入gevent包,使用import greenlet:gr1 = greenlet(test1)

论事件驱动与异步IO

通常,我们写服务器处理模型的程序时,有以下几种模型:
(1)每收到一个请求,创建一个新的进程,来处理该请求;
(2)每收到一个请求,创建一个新的线程,来处理该请求;
(3)每收到一个请求,放入一个事件列表,让主进程通过非阻塞I/O方式来处理请求
上面的几种方式,各有千秋,
第(1)中方法,由于创建新的进程的开销比较大,所以,会导致服务器性能比较差,但实现比较简单。
第(2)种方式,由于要涉及到线程的同步,有可能会面临死锁等问题。
第(3)种方式,在写应用程序代码时,逻辑比前面两种都复杂。
综合考虑各方面因素,一般普遍认为第(3)种方式是大多数网络服务器采用的方式

用户空间和内核空间

现在操作系统都是采用虚拟存储器,那么对于32位操作系统而言,它的寻址空间为4G。操作系统的核心是内核,独立于内存的应用程序,可以访问受保护的内存空间,也有访问底层硬件设备的所有权限。

http://www.cnblogs.com/alex3714/articles/5876749.html

原文地址:https://www.cnblogs.com/laodong1983/p/9449264.html