本篇博文主要介绍python中线程与协程的简单使用姿势

1. 线程

线程,在使用之前需要先引入 threading 模块,基本的使用方式比较简单

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import random
import threading
from threading import Thread


def 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 random
import threading
from threading import Thread


class 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. 其他

1. 一灰灰Bloghttps://liuyueyi.github.io/hexblog

一灰灰的个人博客,记录所有学习和工作中的博文,欢迎大家前去逛逛

2. 声明

尽信书则不如,已上内容,纯属一家之言,因个人能力有限,难免有疏漏和错误之处,如发现bug或者有更好的建议,欢迎批评指正,不吝感激

3. 扫描关注

一灰灰blog

QrCode

知识星球

goals