python多进程和多线程一起使用,python多线程菜鸟教程

  python多进程和多线程一起使用,python多线程菜鸟教程

  很多时候,我们最终会用Python编写代码来执行远程请求或读取多个文件或处理一些数据。很多时候我看到程序员用一个简单的程序员for循环,需要永远完成执行。例如:

  导入请求

  fromtimeimporttime

  url_list=[

  https://via.placeholder.com/400 ,

   https://via.placeholder.com/410 ,

  https://via.placeholder.com/420 ,

   https://via.placeholder.com/430 ,

   https://via.placeholder.com/440 ,

  https://via.placeholder.com/450 ,

   https://via.placeholder.com/460 ,

   https://via.placeholder.com/470 ,

  https://via.placeholder.com/480 ,

   https://via.placeholder.com/490 ,

   https://via.placeholder.com/500 ,

   https://via.placeholder.com/510 ,

  https://via.placeholder.com/520 ,

  https://via.placeholder.com/530 ,

  ]

  defdownload_file(url):

  html=requests.get(url,stream=True)

  返回html.status_code

  开始=时间()

  forurlinurl_list:

  打印(下载文件(url))

  print(f time taken : { time()-start } )输出:

  -被截断-

  这是一个明智的例子。19866 . 868686868617代码将打开每个URL,等待它加载,打印它的状态代码,然后转到下一个URL。这段代码非常适合多线程。

  现代系统可以运行大量线程,这意味着您可以以非常低的开销一次完成多个任务。为什么我们不试着用它来让上面的代码更快的处理这些URL呢?

  我们将使用ThreadPoolExecutor从concurrent.futures库中下载。非常好用。让我向您展示一些代码,然后解释它是如何工作的。

  导入请求

  from concurrent . futuresimportthreadpoolexecutor,as_completed

  fromtimeimporttime

  url_list=[

  https://via.placeholder.com/400 ,

   https://via.placeholder.com/410 ,

  https://via.placeholder.com/420 ,

   https://via.placeholder.com/430 ,

  https://via.placeholder.com/440 ,

  https://via.placeholder.com/450 ,

   https://via.placeholder.com/460 ,

   https://via.placeholder.com/470 ,

  https://via.placeholder.com/480 ,

   https://via.placeholder.com/490 ,

   https://via.placeholder.com/500 ,

   https://via.placeholder.com/510 ,

  https://via.placeholder.com/520 ,

  https://via.placeholder.com/530 ,

  ]

  defdownload_file(url):

  html=requests.get(url,stream=True)

  返回html.status_code

  开始=时间()

  进程=[]

  with threadpoolexecutor(max _ workers=10)as executor :

  forurlinurl_list:

  processes . append(executor . submit(download _ file,url))

  fortaskinas_completed(流程):

  打印(task.result())

  print(f time taken : { time()-start } )输出:

  -被截断-

  我们的代码在时间上已经被加速了将近9倍,我们甚至没有做任何超级参与。58866.88888888861如果URL多,性能优势会更高。

  发生了什么事?当我们调用executor.submit时,我们向线程池添加了一个新任务。我们将这个任务存储在进程列表中。我们稍后重复这个过程并打印出结果。

  as_completed方法在完成后立即从进程列表中生成项目(任务)。任务可以进入完成状态有两个原因。它已完成执行或已被取消。我们还可以传入一个超时参数as_completed。如果任务花费的时间超过该时间段,as_completed将生成此任务。

  你应该探索多线程。对于琐碎的项目,这是加速代码的最快方法。如果你想学习,请阅读https://docs.python.org/3/library/concurrent.futures.html,的官方文件是很有帮助的。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: