Python多种方法获取多线程返回值

  • Post author:
  • Post category:python


【摘要】

近段时间,工作上需要用到多线程,并且要获取多线程的返回值,python多线程一般使用threading模块,但threading模块有个问题,无法返回线程里面运行的结果,我通过三种方法讲解如何获取多线程的返回值。

一、通过获取多线程的返回值有如下三种常用方法:

方法一:通过自定义线程类,继承Thread类,并复写run方法,在run方法中写入执行函数的方式,并把返回值赋值给result;然后通过调用get_result获取每个进程的返回值,代码如下:



  1. import



    threading


  2. import



    Queue

  3. #


    判断值是否为偶数


  4. def



    is_even(value):


  5. if



    value % 2 == 0:


  6. return



    True


  7. else



    :


  8. return



    False


  9. class



    MyThread(threading.Thread):


  10. def



    __init__(self, func, args=()):

  11. super(MyThread, self).__init__()

  12. self.func = func

  13. self.args = args


  14. def



    run(self):

  15. self.result = self.func(*self.args)


    #


    在执行函数的同时,把结果赋值给


    result,

  16. #


    然后通过


    get_result


    函数获取返回的结果


  17. def



    get_result(self):


  18. try



    :


  19. return



    self.result


  20. except



    Exception as e:


  21. return



    None

  22. result = []

  23. threads = []


  24. for



    i



    in



    range(10):

  25. t = MyThread(is_even, args=(i,))

  26. t.start()

  27. threads.append(t)


  28. for



    t



    in



    threads:

  29. t.join()


    #


    一定执行


    join,


    等待子进程执行结束,主进程再往下执行

  30. result.append(t.get_result())


  31. print



    result

方法二:通过python内置的队列Queue接收子进程的返回值,然后再从中取出,代码如下:



  1. import



    threading


  2. import



    Queue


  3. def



    is_even(value, q):


  4. if



    value % 2 == 0:

  5. q.put(True)


  6. else



    :

  7. q.put(False)


  8. def



    multithreading():

  9. q = Queue.Queue()

  10. threads = []

  11. results = []


  12. for



    i



    in



    range(10):

  13. t = threading.Thread(target=is_even, args=(i, q))

  14. t.start()

  15. threads.append(t)


  16. for



    thread



    in



    threads:

  17. thread.join()


    #


    等待子线程结束后,再往后面执行


  18. for



    _



    in



    range(10):

  19. results.append(q.get())


  20. print



    (results)

  21. multithreading()

方法三:通过创建线程池(threadpool)的方式获取返回值,由于该模块属于第三方模块,因此需要先进行安装:pip install threadpool,具体执行代码如下:


  1. import threadpool

  2. #


    判断值是否为偶数

  3. def is_even(value):


  4. if



    value % 2 == 0:


  5. return



    True


  6. else



    :


  7. return



    False

  8. #


    回调函数,接受的参数(请求本身,和请求工作函数执行结果)可以省略

  9. results = []

  10. def get_result(request, result):

  11. global results

  12. results.append(result)

  13. # data


    设置为长度为


    10


    的列表,(列表中每一个数作为参数传递给工作函数运行一次)

  14. data = range(10)

  15. #


    声明可容纳五个线程的池

  16. pool = threadpool.ThreadPool(5)

  17. #


    创建线程运行内容请求列表(线程工作函数,线程工作参数列表,回调函数)

  18. requests = threadpool.makeRequests(is_even, data, get_result)

  19. #


    将每一个线程请求扔进线程池

  20. [pool.putRequest(req)



    for



    req in requests]

  21. #


    等待


    data


    被消耗完,所有线程运行结束。

  22. pool.wait()

  23. print results

运行以上例子,返回的结果如下:


  1. C:\Python27\python.exe D:/bluekingProject/wd-test/app-publish/test.py

  2. [True, False, True, False, True, False, True, False, True, False]

二、总结

以上就是获取多线程返回值的三种方法,其中方法一和方法二用得比较多,并且第一种方法更灵活。



版权声明:本文为qq_20663229原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。