天天看点

转载 生产消费者模型中task_done()具体作用

直奔主题

tase_done()的作用:只有消费者把队列所有的数据处理完毕,queue.join()才会停止阻塞

代码解释

#关于tase_done()的作用:只有消费者把队列所有的数据处理完毕,queue.join()才会停止阻塞

import time

from queue import Queue

from threading import Thread

q = Queue()

def produce():

for i in range(10):

q.put(i)

print('生产:',i)

print('生产任务完毕!')

q.join()

print(produce.__name__,'函数结束!')

def consumer():

for i in range(10):

print('消费:', q.get())

q.task_done()

# if i == 4:

# print('休息1s...')

# time.sleep(1)#sleep作用:查看生产者是否阻塞

print(consumer.__name__,'函数结束!')

pro = Thread(target=produce)

con = Thread(target=consumer)

pro.start()

con.start()

con.join()

print('消费者任务完成')

pro.join()

print('生产者任务完成')

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

28

29

30

31

32

33

34

35

生产: 0

生产: 1

生产: 2

生产: 3

生产: 4

生产: 5

消费: 0

消费: 1

消费: 2

消费: 3

消费: 4

消费: 5

生产: 6

生产: 7

生产:8

消费: 6

消费: 7

消费: 8

生产: 9

生产任务完毕!

消费: 9

consumer 函数结束!

produce 函数结束!

消费者任务完成

生产者任务完成

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

说明:生产任务已经完毕为什么没有直接produce函数结束?说明这里产生了阻塞,产生阻塞的原因是因为消费者没有处理完生产者所有任务。tase_done()的作用:只有消费者把队列所有的数据处理完毕,queue.join()才会停止阻塞所以才会有produce函数结束!然后生产任务结束。

对比解释看效果

注释掉q.task_done()和q.join()

#关于tase_done()的作用:只有消费者把队列所有的数据处理完毕,queue.join()才会停止阻塞

import time

from queue import Queue

from threading import Thread

q = Queue()

def produce():

for i in range(10):

q.put(i)

print('生产任务完毕!')

# q.join()

# if i == 4:

# print('休息1s...')

# time.sleep(1)#sleep作用:查看生产者是否阻塞

print(produce.__name__,'函数结束!')

def consumer():

for i in range(10):

print('消费:', q.get())

# q.task_done()

print(consumer.__name__,'函数结束!')

pro = Thread(target=produce)

con = Thread(target=consumer)

pro.start()

con.start()

con.join()

print('消费者任务完成')

pro.join()

print('生产者任务完成')

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

28

29

30

31

32

33

34

生产: 0

生产: 1

生产: 2

生产: 3

生产: 4

生产: 5

生产: 6

生产: 7

生产: 8

生产: 9

消费: 0

消费: 1

生产任务完毕!

produce 函数结束!

消费: 2

消费: 3

消费: 4

消费: 5

消费: 6

消费: 7

消费: 8

消费: 9

consumer 函数结束!

消费者任务完成

生产者任务完成

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

说明:不带task_done()和join()情况下生产任务结束,produce函数立刻结束,并没有等待消费者处理完所有任务立即结束。

仅注释掉q.task_done()**

#关于tase_done()的作用:只有消费者把队列所有的数据处理完毕,queue.join()才会停止阻塞

import time

from queue import Queue

from threading import Thread

q = Queue()

def produce():

for i in range(10):

q.put(i)

print('生产任务完毕!')

q.join()

print(produce.__name__,'函数结束!')

def consumer():

for i in range(10):

print('消费:', q.get())

# q.task_done()

# if i == 4:

# print('休息1s...')

# time.sleep(1)#sleep作用:查看生产者是否阻塞

print(consumer.__name__,'函数结束!')

pro = Thread(target=produce)

con = Thread(target=consumer)

pro.start()

con.start()

继续阅读