随笔分类 -  并发编程

摘要:import threading class MyThread(threading.Thread): def __init__(self,func,args=()): super(MyThread,self).__init__() self.func = func self.args = args def run(self)... 阅读全文
posted @ 2019-04-19 17:33 aaronthon 阅读(1182) 评论(0) 推荐(0) 编辑
摘要:线程池待补充 阅读全文
posted @ 2018-10-27 11:11 aaronthon 阅读(110) 评论(0) 推荐(0) 编辑
摘要:定时器的作用就是多少秒之后开启一个线程。 注意这里的Timer是异步的。 阅读全文
posted @ 2018-10-26 23:44 aaronthon 阅读(157) 评论(0) 推荐(0) 编辑
摘要:条件Condition相当于给锁造钥匙,但是这钥匙是一次性的。一个线程拿到钥匙进去,出来之后钥匙没有归还,而是没了。 如下代码: 条件在创建之初,状态是False。 里面有四个命令: wait() 当状态是False的时候,程序阻塞。等钥匙。 notify(num) 造钥匙,num一定要是int类型 阅读全文
posted @ 2018-10-26 20:34 aaronthon 阅读(266) 评论(0) 推荐(0) 编辑
摘要:线程和进程一样也有信号量,一个资源在同一时刻只有规定数量的线程能使用。 阅读全文
posted @ 2018-10-25 21:17 aaronthon 阅读(152) 评论(0) 推荐(0) 编辑
摘要:死锁 说到死锁,可以讲一个科学家吃面的问题: 有几个科学家在一张桌子旁,桌子上只有一把筷子和一碗面,我们将面和筷子都加锁。这是可能会导致一个科学家抢到面,另一个科学家抢到筷子,这是就全部阻塞了,这就是死锁了。 如下代码: 打印结果: 看到小红拿到了面条,而小兰拿到了筷子,他们都需要对方拿到的资源来完 阅读全文
posted @ 2018-10-23 20:45 aaronthon 阅读(639) 评论(0) 推荐(0) 编辑
摘要:这段代码结果我们知道,因为GIL的原因,结果是0 再看如下代码: 打印结果却是9 为什么呢? 因为在0.1秒之内,所有线程肯定都进来了,但是需要睡0.1秒,这就是阻塞状态,他们会把手里的数据让给其他线程,所以每个线程的temp都是10,阻塞结束,10减1全变成9都写入内存,最终n的值就是9了,这样就 阅读全文
posted @ 2018-10-22 23:14 aaronthon 阅读(133) 评论(0) 推荐(0) 编辑
摘要:如下代码: 结果是:先打印 主线程结束,等十秒之后打印1 如下代码,加入守护线程: 结果是,只打印了 主线程结果,没打印子线程结果,也没等10秒,直接结束。 所以守护线程是随着主线程的结束而结束。 再看一个现象: 结果是,先打印 主线程结束,等3秒之后打印 子线程2 4 然后没有等待子线程1就直接结 阅读全文
posted @ 2018-10-22 22:43 aaronthon 阅读(149) 评论(0) 推荐(0) 编辑
摘要:import threading import time def func(n): time.sleep(0.5) n += 1 print(n, threading.current_thread(), threading.get_ident()) for i in range(10): threading.Thread(target=func, args... 阅读全文
posted @ 2018-10-21 16:25 aaronthon 阅读(156) 评论(0) 推荐(0) 编辑
摘要:我们使用高并发,一次是创建1万个线程去修改一个数并打印结果看现象: 我们可以看到,虽然是高并发,但是没有一条数据是重复的,为什么?因为Python解释器里面有全局解释器锁GIL,会让解释器每一时刻只有一个线程在运行,这样就保证了数据的安全了。 从这里我们也看出了,因为有全局解释器锁的存在就导致代码的 阅读全文
posted @ 2018-10-21 13:34 aaronthon 阅读(123) 评论(0) 推荐(0) 编辑
摘要:创建一个线程: 创建多线程: 一个进程中的线程数据是共享的: 另一种情况: 看到结果都变成一样的了,因为每个线程都将n的值变一次,不管变几次,n最终只有一个值,所在在0.1秒之后在输出n,都输出n的值了,就变成一样的了。 这种情况就会导致数据不安全,因为我不想要同一个输出结果,我想每个线程更改数据都 阅读全文
posted @ 2018-10-20 22:01 aaronthon 阅读(151) 评论(0) 推荐(0) 编辑
摘要:为什么有进程? 原来操作系统只能处理一件任务,有了进程就可以让操作系统处理多个任务。因为进程与进程之间是完全隔离的,涉及到了内存空间、数据的切换,所以就有了进程的概念。 已经有了进程,为什么还要线程? 线程有以下缺陷: 1,线程在同一时间只能干同一件事儿。 2,线程在执行任务的过程遇到阻塞,比如对等 阅读全文
posted @ 2018-10-19 11:46 aaronthon 阅读(790) 评论(0) 推荐(0) 编辑
摘要:如下代码: 结果是 in func1 这是通过回调函数就可以执行func2了: 打印结果: 这回调函数的作用就是将函数func1的返回值传给func2,并执行func2函数,所以不能在pool.apply_async里面单独给func2传值,func2接受的参数就是func1的返回值。 判断func 阅读全文
posted @ 2018-10-18 21:37 aaronthon 阅读(3675) 评论(0) 推荐(0) 编辑
摘要:进程池的同步,如下程序: 查看结果: 可以发现,变成了进程变成了同步得了,运行特别慢。 apply方法的作用就是将进程池的进程变成同步的。 将进程池变成异步的,使用apply_async就可以了,如下: 但是发现结果什么都没有,因为主进程没有等子进程的结束就执行完了。 如下优化,使用join就行了: 阅读全文
posted @ 2018-10-17 23:37 aaronthon 阅读(977) 评论(0) 推荐(0) 编辑
摘要:为什么会有进程池的概念? 当我们开启50个进程让他们都将100这个数减1次减到50,你会发现特别慢! 效率问题,原因: 1,开辟内存空间。因为每开启一个进程,都会开启一个属于这个进程池的内存空间,因为进程与进程之间数据是完全隔离的。 2,并且这些独立的内存空间会有许多寄存器,堆栈,文件等,他们存着这 阅读全文
posted @ 2018-10-16 21:42 aaronthon 阅读(1623) 评论(0) 推荐(0) 编辑
摘要:将数据设置成共享数据,一个进程修改了数据,另外一个进程就能就接受的被修改的数据。 起50个进程让他们都去操作一个数据: 多运行几次发现,结果有时是50,有时是53,有时是57等等。。。 为什么会出现这个结果,因为一个88被一个进程拿到要去修改还没修改时被其他进程拿到,然后这个进程将数据修改成87并写 阅读全文
posted @ 2018-10-15 22:19 aaronthon 阅读(121) 评论(0) 推荐(0) 编辑
摘要:管道是双向通信的,数据从其中一端传入,就会从另外一端传出。 在进程间通过管道实现通信。 多次发数据: 另一种方式close(): 阅读全文
posted @ 2018-10-15 19:54 aaronthon 阅读(211) 评论(0) 推荐(0) 编辑
摘要:生产者生产的东西放到队列里,消费者消费掉东西。 阅读全文
posted @ 2018-10-14 15:40 aaronthon 阅读(149) 评论(0) 推荐(0) 编辑
摘要:队列是先进先出。 进程间通信: 这样就实现了子进程与主进程,子进程与子进程之间的通信了。 阅读全文
posted @ 2018-10-13 20:21 aaronthon 阅读(183) 评论(0) 推荐(0) 编辑
摘要:信号量可以控制一个或多个进程同时进行阻塞或执行。 一个事件被创建后,默认是阻塞状态。 阅读全文
posted @ 2018-10-13 13:00 aaronthon 阅读(161) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示