Python高级基础
风从北方来
一枚前端攻城狮
展开
-
Python---全局解释器锁
全局解释器锁(Global Interpreter Lock ): 在 Python 语言的主流实现 CPython 中,GIL 是一个货真价实的全局线程锁,在解释器解释执行任何 Python 代码时,都需要先获得这把锁才行,在遇到 I/O 操作时会释放这把锁。如果是纯计算的程序,没有 I/O 操作,解释器会每隔 100 次操作就释放这把锁,让别的线程有机会执行(这个次数可以通过 sys.setc...原创 2018-05-02 10:02:36 · 340 阅读 · 0 评论 -
Python---信号量
信号量:信号量可以理解为多把锁,同时允许多个线程来更改数据。而互斥锁同时只允许一个线程更改数据。例子:import threading,timedef run(n): semaphore.acquire() #获取信号量 time.sleep(1) #每隔1秒弹出一次运行结果 print("run the thread: %s"%n) semaphore...原创 2018-05-02 10:50:36 · 1634 阅读 · 0 评论 -
Python---事件Event
Event用法:event=threading.Event() #设置一个事件实例event.set() #设置标志位event.clear() #清空标志位event.wait() #等待设置标志位红绿灯实例:#红绿灯'''标志位设定,代表绿灯,直接通行;标志位被清空,代表红灯;wait()等待变绿灯'''import threading,timeevent=threading.Ev...原创 2018-05-02 14:16:26 · 12290 阅读 · 0 评论 -
Python---队列
queue队列为Python的一个自带库。队列相当于一个有顺序的容器。列表与队列区别:列表取数相当于复制一份值,而队列取走就没了。 队列数据存储在内存中。队列作用:解耦(即建立函数间的关联);提高运算效率。queue常用方法:Queue() #先入先出LifoQueue() #后进先出PriorityQueue() #存储数据时可设置优先级的队列实例1:LifoQueue()运用import q...原创 2018-05-02 16:05:28 · 296 阅读 · 0 评论 -
Python---多进程
Python多线程依赖CPU的上下文切换实现,实则为假线程,本质是单线程。io操作不占用CPU,而计算占用CPU,大量计算消耗资源,浪费时间,多线程都不如单线程快,因此Python 多线程不适合CPU密集操作型的任务,适合io操作密集型的任务。而Python多进程可以解决Python多线程的缺陷,多进程可以用于需要大量计算的任务。多进程实例1:import multiprocessing,time...原创 2018-05-02 18:34:36 · 128 阅读 · 0 评论 -
Python---进程间数据交互与共享
进程间数据交互的3种方式:队列Queue,管道Pipe,Manager。#队列实现进程间数据交互from multiprocessing import Process,Queuedef run(q): q.put(["xiaohei",89,None])if __name__=='__main__': Q=Queue() P=Process(target=run,...原创 2018-05-03 11:15:34 · 2417 阅读 · 0 评论 -
Python---进程池
进程池作用:同一时间有多个进程在CPU中运行。进程池实现步骤:(1)定义一个进程池对象:pool=Pool(processes=n)#允许进程池同时放入n个进程 (2)设置多线程:for i in range(n) (3)进程池实现 pool.apply()同步串行; pool.apply_async()异步并行 ...原创 2018-05-03 12:13:31 · 197 阅读 · 0 评论 -
Python---协程
协程:通过函数切换实现,本质是单线程。遇到IO操作就切换,CPU不认识协程,协程由用户操作。协程工作原理:协程拥有自己的寄存器和栈,在调度切换时,将寄存器上下文和栈保存到其他地方,切换回来时,恢复先前保存的寄存器上下文和栈。实例1:利用greenlet库实现协程手动切换from greenlet import greenletdef fun1(): print("Hello") ...原创 2018-05-05 20:07:36 · 229 阅读 · 0 评论 -
Python---利用gevent协程实现多socket并发
服务端:import socket,geventfrom gevent import socket,monkeymonkey.patch_all()def server(port): s=socket.socket() s.bind(('0.0.0.0',port)) s.listen(500) while True: cli,addr=s....原创 2018-05-05 21:50:07 · 2819 阅读 · 0 评论