本篇博文主要介绍python中线程与协程的简单使用姿势
1. 线程 线程,在使用之前需要先引入 threading
模块,基本的使用方式比较简单
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 import randomimport threadingfrom threading import Threaddef cal () : print('print cal %s' % threading.current_thread().name) t = threading.Thread(target=cal, name='testThread' ) t.start() t.join() print("over" )
使用线程的三步骤:
创建线程 threading.Thread(target=cal, name='testThread')
执行线程 t.start()
等待线程执行完毕 t.join()
如果需要获取线程执行之后返回的结果,改怎么办?这个时候就需要简单的封装一下,因为Thread.join
默认是没有返回值的,但是我们可以通过继承Thread类来实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 import randomimport threadingfrom threading import Threadclass MyThread (threading.Thread) : def __init__ (self, group=None, target=None, name=None, args=() , kwargs=None, *, daemon=None) : Thread.__init__(self, group, target, name, args, kwargs, daemon=daemon) self._return = None def run (self) : if self._target is not None : self._return = self._target(*self._args, **self._kwargs) def join (self) : Thread.join(self) return self._return def cal () : print('print cal %s' % threading.current_thread().name) return random.random() * 10 t = MyThread(target=cal, name="newTestThread" ) t.start() ans = t.join() print("out" , ans)
2. 协程 比线程更优的实现方式,没实际使用过,先拿一个case放着,后面再说
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 def consumer(): r = '' while True: n = yield r if not n: return print('[CONSUMER] Consuming %s...' % n) r = '200 OK' def produce(c): c.send(None) n = 0 while n < 5: n = n + 1 print('[PRODUCER] Producing %s...' % n) r = c.send(n) print('[PRODUCER] Consumer return: %s' % r) c.close() c = consumer() produce(c)
II. 其他 一灰灰的个人博客,记录所有学习和工作中的博文,欢迎大家前去逛逛
2. 声明 尽信书则不如,已上内容,纯属一家之言,因个人能力有限,难免有疏漏和错误之处,如发现bug或者有更好的建议,欢迎批评指正,不吝感激
3. 扫描关注 一灰灰blog
知识星球