关于线程与主进程的执行顺序

关于线程与主进程的执行顺序

import time
import os
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())                  # 获取程序的pid
    t = ThreadPoolExecutor(2)               # 创建线程池,参数是设置的线程池的数量
    result = []
    for i in range(20):
        t_result = t.submit(work, (i, ))
        result.append(t_result)

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

在main函数中,第一个for循环是线程池的循环,那个第一个for循环和第二个for循环的执行顺序是怎样的。我理解应该是第一个循环执行完后再去执行第二个循环,main函数为一个主进程,应该是由上而下的执行对吧,而且我理result是一个集合,for循环只执行它一次吧

正在回答

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

1回答

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

祝学习愉快~


  • 你甚至都不愿意 提问者 #1

    for res  in result执行完一次不会结束嘛?它会等待result的值增加继续执行?

    2023-04-10 17:45:55
  • 同学,你好!执行for res in result 时,res 是Future对象,若当前线程已经返回值,使用res.result()可获取当前线程的返回值,若当前线程返回的Future对象没有值则等待,等待有值再res.result()获取值。

    同学可以使用time.sleep(10)让第二个for循环晚些执行。执行第二个for循环时已经执行了很多线程并有返回值了。再执行第二个for循环时会输出已经返回的值,输出完成后,等待没有返回的线程返回值,有值再输出。

    https://img1.sycdn.imooc.com//climg/6433e2fd093edf5c05810340.jpg

    https://img1.sycdn.imooc.com//climg/6433e2210982e84103580829.jpg


    祝学习愉快~

    2023-04-10 18:21:57
问题已解决,确定采纳
还有疑问,暂不采纳

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

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

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

在线咨询

领取优惠

免费试听

领取大纲

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