请问老师一个课外线程池的问题

请问老师一个课外线程池的问题

老师,在学习线程池的时候,有个小问题,想请教下!

代码1:

​def test_run():
sum = 0
for i in range(10000000):
sum += i
print(sum)

if __name__ == "__main__":
executor = ThreadPoolExecutor(max_workers=2)
executor.submit(test_run)

代码2:

def test():
print('start')
executor.submit(test_run)
print('end')

def test_run():
sum = 0
for i in range(10000000):
sum += i
print(sum)

if __name__ == "__main__":
executor = ThreadPoolExecutor(max_workers=2)
executor.submit(test)

在代码1中,主线程会等待线程池中的提交的线程运行结束后才退出。而代码2在主线程向线程池中提交了一个任务1后,又在该函数中向线程池提交另一个任务2,主线程并没有等待任务1完成再退出!请问是什么原因?

正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

1回答
好帮手慕美 2021-03-29 15:32:23

同学,你好!使用submit()函数来提交需要执行的任务到线程池中,会立即返回,不是阻塞的。

可以使用result()方法可以获取任务的返回值

http://img1.sycdn.imooc.com//climg/6061829d09e2a24306490657.jpg

祝学习愉快!

  • 提问者 五栋一哥 #1
    def test_run():
    sum = 0
    for i in range(10000000):
    sum += i
    print(sum)

    if __name__ == "__main__":
    executor = ThreadPoolExecutor(max_workers=2)
    executor.submit(test_run)

    那既然不是阻塞的,那这个代码不是应该直接结束吗?

    2021-03-29 21:16:05
  • 提问者 五栋一哥 #2
    def test():
        print('start')
        executor.submit(test_run)
        print('end')

    def test_run():
        sum = 0
        for i in range(10000000):
            sum += i
        print(sum)

    if __name__ == "__main__":
      executor = ThreadPoolExecutor(max_workers=2)
    executor.submit(test)

    在这个代码中,print('end')为什么不会输出?

    2021-03-29 22:45:02
  • 好帮手慕美 回复 提问者 五栋一哥 #3

    同学,你好!

    1、submit返回一个Future对象,对于Future对象可以理解为一个在未来完成的操作。主线程并不会等待线程池里的线程执行完毕,因此end没有输出,主线程直接结束

    2、可以使用done()方法用于判定某个任务是否完成,False表示没有完成。输出的结果是test_run()中的print

    http://img1.sycdn.imooc.com//climg/606286230914be1107030482.jpg

    祝学习愉快!

    2021-03-30 10:04:51
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师