Python-如何在Python中使用线程?

发布于 2021-02-02 23:24:13

我试图了解Python中的线程。我看过文档和示例,但坦率地说,许多示例过于复杂,我难以理解它们。

你如何清楚地显示为多线程而划分的任务?

关注者
0
被浏览
263
1 个回答
  • 面试哥
    面试哥 2021-02-02
    为面试而生,有面试问题,就找面试哥。

    我将在下面进行总结-最终仅是几行代码:

    from multiprocessing.dummy import Pool as ThreadPool
    pool = ThreadPool(4)
    results = pool.map(my_function, my_array)
    

    这是以下内容的多线程版本:

    results = []
    for item in my_array:
        results.append(my_function(item))
    

    描述

    Map是一个很棒的小功能,是轻松将并行性注入Python代码的关键。对于那些不熟悉的人来说,地图是从Lisp等功能语言中提炼出来的。它是将另一个功能映射到序列上的功能。

    Map为我们处理序列上的迭代,应用函数,并将所有结果存储在最后的方便列表中。

    在此处输入图片说明

    实作

    map函数的并行版本由以下两个库提供:multiprocessing,以及鲜为人知但同样出色的继子child:multiprocessing.dummy

    multiprocessing.dummy与多处理模块完全相同,但是使用线程代替(一个重要的区别 -使用多个进程来处理CPU密集型任务;用于I / O的线程)。

    multiprocessing.dummy复制了多处理的API,但仅不过是线程模块的包装器。

    import urllib2
    from multiprocessing.dummy import Pool as ThreadPool
    
    urls = [
      'http://www.python.org',
      'http://www.python.org/about/',
      'http://www.onlamp.com/pub/a/python/2003/04/17/metaclasses.html',
      'http://www.python.org/doc/',
      'http://www.python.org/download/',
      'http://www.python.org/getit/',
      'http://www.python.org/community/',
      'https://wiki.python.org/moin/',
    ]
    
    # Make the Pool of workers
    pool = ThreadPool(4)
    
    # Open the URLs in their own threads
    # and return the results
    results = pool.map(urllib2.urlopen, urls)
    
    # Close the pool and wait for the work to finish
    pool.close()
    pool.join()
    

    以及计时结果:

    Single thread:   14.4 seconds
           4 Pool:   3.1 seconds
           8 Pool:   1.4 seconds
          13 Pool:   1.3 seconds
    

    传递多个参数(仅在Python 3.3和更高版本中才这样):

    要传递多个数组:

    results = pool.starmap(function, zip(list_a, list_b))
    

    或传递一个常数和一个数组:

    results = pool.starmap(function, zip(itertools.repeat(constant), list_a))
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看