摘要: 互斥锁和排斥锁 同一时间只能有一个线程处理同一段代码。比如,只有一个坑的卫生间 信号量:同时最多可以有N个线程同时处理同一段代码。 比如有3个坑的卫生间,最多可以有三个人同时使用。 运行结果: 线程0 正在占坑。。。 线程1 正在占坑。。。 线程2 正在占坑。。。 线程3 正在占坑。。。 线程5 正 阅读全文
posted @ 2018-06-16 23:24 beallaliu 阅读(132) 评论(0) 推荐(0) 编辑
摘要: 1. 排斥锁可能会造成死锁,先看看死锁的现象 运行结果: Thread-1 拿到了A锁 Thread-1 拿到了B锁 Thread-1 拿到了B锁 Thread-2 拿到了A锁 卡住了。。。。。。 2. 互斥锁Lock,只能acquire()一次, 递归锁RLock可以acquire()多次 3. 阅读全文
posted @ 2018-06-16 22:57 beallaliu 阅读(226) 评论(0) 推荐(0) 编辑
摘要: GIL锁是解释器级别的锁,跟垃圾回收有关系, python执行代码,要先获得解释器的锁GIL。 但GIL锁保证不了代码的数据。 不同的数据要有不同的锁。 计算密集型用多进程,IO密集型用多线程。多线程有并发,没有并行的优势。 阅读全文
posted @ 2018-06-16 21:13 beallaliu 阅读(112) 评论(0) 推荐(0) 编辑
摘要: 运行结果: 主 99 加了互斥锁: 运行结果: 主 0 互斥锁的作用:将并行变成串行。保护不同的数据,加不同的锁。 多线程用不到多核CPU的优势,它只能并发,不能并行。并发:看起来像同时运行,并行:多核同时运行. 阅读全文
posted @ 2018-06-16 20:41 beallaliu 阅读(136) 评论(0) 推荐(0) 编辑
摘要: 守护进程与守护线程的区别: 守护进程:主进程代码运行完后,守护进程就终止。 守护线程:主进程运行完后,守护线程就终止。不过,如果主线程有多个线程的话, 其他线程未执行完,主线程就还在。守护线程会等主进程下的所有线程都执行完才终止。 守护进程: 运行结果: 主线程 True 守护线程: 运行结果: 守 阅读全文
posted @ 2018-06-16 20:23 beallaliu 阅读(105) 评论(0) 推荐(0) 编辑
摘要: Thread实例对象的方法: getName(): 返回线程名 setName('XXX'): 设置线程名 is_alive(): 线程是否存活 threading模块提供的一些方法: threading.current_thread() : 返回当前线程的变量 threading. enumera 阅读全文
posted @ 2018-06-16 19:25 beallaliu 阅读(161) 评论(0) 推荐(0) 编辑
摘要: 方式一: 方式二: 阅读全文
posted @ 2018-06-16 18:39 beallaliu 阅读(162) 评论(0) 推荐(0) 编辑
摘要: 线程与进程的区别: 1. 同一进程的线程间共享内存资源,进程间内存资源是独立的 1.1 进程: 输出: 主线程 100 1.2 线程: 输出: 主线程 0 2. 开进程开销大,开线程开销小 2.1 线程: import time from threading import Thread from m 阅读全文
posted @ 2018-06-16 18:28 beallaliu 阅读(170) 评论(0) 推荐(0) 编辑
摘要: 用途: 程序中有两类角色,一类用来生产数据,一类用来消费数据。 生产者消费者模型引入队列 解耦合 如果使用multiprocessing中的Queue的这种生产消费模型,必须在同一台机器上,集中式 如何分布? 阅读全文
posted @ 2018-06-16 17:54 beallaliu 阅读(120) 评论(0) 推荐(0) 编辑
摘要: 运行结果: True 1 ['1,', 2, ''] {'a': 1} True 阅读全文
posted @ 2018-06-16 17:48 beallaliu 阅读(74) 评论(0) 推荐(0) 编辑
摘要: 路人0 正在查询剩余票数。。。。路人1 正在查询剩余票数。。。。路人2 正在查询剩余票数。。。。路人3 正在查询剩余票数。。。。路人4 正在查询剩余票数。。。。路人6 正在查询剩余票数。。。。路人5 正在查询剩余票数。。。。路人7 正在查询剩余票数。。。。路人8 正在查询剩余票数。。。。路人9 正在 阅读全文
posted @ 2018-06-16 17:01 beallaliu 阅读(93) 评论(0) 推荐(0) 编辑
摘要: 互斥锁:并发串行,是对代码的局部做串型。是共享数据修改的那块代码变成串型。 join: join也是并发串行的。但是join是全局的串型。 互斥锁:牺牲效率保证数据的安全。 队列:效率+数据安全,详见队列一文 进程之间内存是独立的,但其他资源是共享的,如可以操作同一个文件。 没有互斥锁的情况下,以下 阅读全文
posted @ 2018-06-16 14:14 beallaliu 阅读(107) 评论(0) 推荐(0) 编辑
摘要: 子进程设置为守护进程后,在主进程代码执行结束(而非进程退出)后,子进程就终止。 如果子进程没有设置为守护进程,那么主进程会等子进行结束才结束主进程。 1. 守护进程的设置必须在start前设置。 2. 守护进程无法再开启子进程。 验证守护进程无法再开启子进程: 输出结果: 报错: 守护进程练习题: 阅读全文
posted @ 2018-06-16 13:51 beallaliu 阅读(448) 评论(0) 推荐(0) 编辑
摘要: 1. 进程之间内存空间是隔离还是共享的? 请看代码的输出结果: from multiprocessing import Process n=100 #在windows系统中应该把全局变量定义在if __name__ == '__main__'之上就可以了 def work(): global n n 阅读全文
posted @ 2018-06-16 13:28 beallaliu 阅读(132) 评论(0) 推荐(0) 编辑
摘要: p.start() # 只是将命令交给操作系统,操作系统什么时候执行,主进程并不关心。主进程执行完p.start()交给操作系统后,就会立马执行下一条语句。 p.join() # 当主进程执行到p.join()时,会就等待p子进程执行完后,再继续下一语句。 不过,注意了,如果有多个子进程,并不是串行 阅读全文
posted @ 2018-06-16 10:47 beallaliu 阅读(135) 评论(0) 推荐(0) 编辑
摘要: 僵尸进程:一个子进程在其父进程还没有调用wait()或waitpid()的情况下退出。这个子进程就是僵尸进程。任何一个子进程(init除外)在exit()之后,并非马上就消失掉,而是留下一个称为僵尸进程(Zombie)的数据结构,等待父进程处理。这是每个 子进程在结束时都要经过的阶段。如果子进程在e 阅读全文
posted @ 2018-06-16 10:09 beallaliu 阅读(197) 评论(0) 推荐(0) 编辑
摘要: 获取本进程id: os.getpid() 或: 获取父进程id: os.getppid() 阅读全文
posted @ 2018-06-16 09:33 beallaliu 阅读(659) 评论(0) 推荐(0) 编辑
摘要: 当主进程开启子进程后,主进程会与子进程并行执行。当主进程执行后不会立马结束进程,而是会等子进程结束才结束,好去清理僵尸子进程(给子进程收尸)。 进程之间内存是相互隔离的。当创建子进程时,会把父进程的内存空间拷贝一份到子进程,子进程的改变不会影响主进程的内存空间。 但进程之间的IO是共享的,可以同时操 阅读全文
posted @ 2018-06-16 09:20 beallaliu 阅读(291) 评论(0) 推荐(0) 编辑