再谈Python多线程--正确的使用场景
来源:互联网 发布:淘宝开店店名可以改吗 编辑:程序博客网 时间:2024/05/18 21:06
多线程是编程过程中经常会使用到的手段,其目的是为了能提高任务执行的效率。在Python中,我们都知道实现多线程主要有2种方式:
一个简单的多线程的样例如下:
另外一些时候你可能有这样的需求。即希望主线程不要提前结束,直到所有的子线程都执行完毕;又希望在子线程运行的同时,主线程不要被阻塞暂停,而是仍然继续执行,直到主线程执行到最后才等待子线程的结束。那么此时你就可以去掉join方法即可:
- 使用threading.Thread()方法
- 继承threading.Thread类
一个简单的多线程的样例如下:
import threadingl = []n = 2max_n = 10000x = 0def countdown(): global x while x < max_n: x += 1 print '%s: %s\r\n' % (threading.currentThread().getName(), x)for i in range(n):t = threading.Thread(target=countdown) t.start()l.append(t)for t in l: t.join()执行结果:
Thread-1: 1Thread-1: 2Thread-2: 3Thread-1: 4Thread-1: 5Thread-2: 6执行这段程序会启动n个线程同时对共享变量x进行交替加1操作,直到满足条件的最大数。是不是很简单?但是对于初学者来讲,一不小心就会让多线程变为单线程执行了。比如我们把代码稍微改动一下:
import threadingn = 2max_n = 10000x = 0def countdown(): global x while x < max_n: x += 1 print '%s: %s\r\n' % (threading.currentThread().getName(), x)for i in range(n):t = threading.Thread(target=countdown) t.start() t.join()执行结果:
Thread-1: 1Thread-1: 2Thread-1: 3...Thread-1: 10000再次执行这段程序时,你会发现只启动1个线程对x变量进行加1操作。原因就是join语句的位置不一样,因为join会阻塞主线程的执行,所以我们不能在启动一个子线程后就执行join,这样会阻塞主线程启动其它子线程(上面代码中线程2是在线程1执行完任务之后才被启动的,而此时已经没有任务可做了),而应该在启动完所有子线程之后才执行join。
另外一些时候你可能有这样的需求。即希望主线程不要提前结束,直到所有的子线程都执行完毕;又希望在子线程运行的同时,主线程不要被阻塞暂停,而是仍然继续执行,直到主线程执行到最后才等待子线程的结束。那么此时你就可以去掉join方法即可:
import threadingn = 2max_n = 10000x = 0def countdown(): global x while x < max_n: x += 1 print '%s: %s\r\n' % (threading.currentThread().getName(), x)for i in range(n): t = threading.Thread(target=countdown) t.start()最后如果你希望主线程在执行完之后,不要等待子线程而直接退出,那么可以使用setDaemon方法。设置这个方法,主线程在退出的时候不会检查子线程是否已结束。
import threadingn = 2max_n = 10000x = 0def countdown(): global x while x < max_n: x += 1 print '%s: %s\r\n' % (threading.currentThread().getName(), x)for i in range(n): t = threading.Thread(target=countdown) t.setDaemon(True)##一定要在start之前调用,否则无效 t.start()执行结果:
Thread-1: 1Thread-1: 2Thread-1: 3...Thread-1: 21
阅读全文
0 0
- 再谈Python多线程--正确的使用场景
- 多线程的作用和使用场景
- 多线程/多进程的使用场景-Android
- redis(二)Redis适用场景,如何正确的使用
- 多线程使用场景
- Java多线程使用场景
- 正确使用Qt多线程
- 正确使用Qt多线程
- 正确使用Qt多线程
- 正确使用Qt多线程
- 正确使用Qt多线程
- python 多线程的使用
- python多线程的使用
- [Python-tools]defaultdict的使用场景
- 多线程的应用场景
- 多线程的应用场景
- 多线程的应用场景
- 多线程的应用场景
- web 注释符号
- 测试人员代码走查基础要点
- (一)java并发编程--计算机中的进程和线程(多进程和多线程)
- 二进制 字节 字符
- C++ 类声明 类前置声明
- 再谈Python多线程--正确的使用场景
- 一个sh脚本(留作借鉴)
- 如何阻止修改input里的值
- html-dom (scroll offset client)
- Hive分析函数之CUME_DIST、PERCENT_RANK学习
- Tensorflow实例:自编码器
- MVP简单实现OKHttp+recyclerview+springview
- IBM V7000存储Mdisk磁盘掉线数据恢复_服务器数据恢复
- 蓝桥杯 算法提高 7-1用宏求球的体积 ADV-221