result()函数

result()函数

如果把result()放在第一个for循环,和放在第二个for循环有什么不同呢?

# coding:utf-8

import os
import time
import threading
from concurrent.futures import ThreadPoolExecutor

#  添加线程锁
lock = threading.Lock()


def work(i):
    # lock.acquire()
    print(i, os.getpid())
    time.sleep(1)
    # lock.release()
    return 'result %s' % i



if __name__ == '__main__':
    print(os.getpid())
    # 创建进程池
    t = ThreadPoolExecutor(2)
    result = []
    for i in range(20):
        # 在池中加入任务, 线程池有返回值
        t_result = t.submit(work, (i,))
        # result.append(t_result)
        print(t_result.result())

    # for res in result:
    #     print(res.result())


正在回答

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

1回答

同学,你好!在第一个for 循环中输出result(),是把当前运行线程的返回值进行输出。遇到result()主线程会阻塞,执行完print(t_result.result())才会进行下一次循环,即执行一个线程并输出该线程的返回值。

第二个循环中输出result(),是将所有线程的返回结果加入到列表中,再对线程的返回值进行输出。祝学习愉快~


  • 呆呆桃 提问者 #1

    老师,您好!

    可以讲一下这两个for循环执行的顺序吗,以及print和return的执行顺序。

    这里一共创建了2个线程,print语句和return语句是进入的同一个线程吗?是print语句先执行完,出来后,return语句再执行吗?


    再问个另外的问题,如果这里没有创建线程池,直接在for循环中创建线程,是不是就有20个线程?同理进程也是这样?



    2022-07-06 21:57:36
  • 好帮手慕小猿 回复 提问者 呆呆桃 #2

    同学,你好!1、在for i in range(20)循环中,执行t.submit(work, (i,))线程池每次执行两个线程,将返回的 Future 对象添加到列表中。线程执行时for res  in result 也在执行,在执行线程过程中运行程序的速度不同, 所以返回的结果的时间也是不同的,若线程执行完有返回值则执行result()获取返回值,没有则等有返回值后再输出

    2、print语句和return语句不是同一个线程,print 和return 的执行顺序不固定,若线程执行完有return返回值则print输出线程的返回值,没有则等待输出

    3、是的,使用for 循环有20个线程
    祝学习愉快~


    2022-07-07 11:19:55
问题已解决,确定采纳
还有疑问,暂不采纳

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

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

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

在线咨询

领取优惠

免费试听

领取大纲

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