线程 内存共享
线程同时修改同一份数据时必须加锁,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
用户空间和内核空间
现在操作系统都是采用虚拟存储器,那么对于32位操作系统而言,它的寻址空间为4G。操作系统的核心是内核,独立于内存的应用程序,可以访问受保护的内存空间,也有访问底层硬件设备的所有权限。
http://www.cnblogs.com/alex3714/articles/5876749.html