python如何中断程序,python终止线程池中的线程
Python中断子线程
默认情况下,Python的运行时在一个线程中执行,该线程的流程由其全局解释器锁(GIL)控制。在大多数情况下,这不是一个很大的瓶颈,但是当您必须并行运行许多作业时,它就会成为一个瓶颈。
Python提供了两种方法来解决这个问题:线程和多重处理。每个选项都允许您执行长时间运行的作业,将它们分成并行批处理,然后并行运行它们。
[InfoWorld的基本知识: Anaconda入门,Anaconda是数据科学的Python发行版 。• Python的Anaconda发行版中的新增功能 。• 5个用于数据科学的基本Python工具-现已改进 。通过InfoWorld的App Dev Report新闻通讯了解编程方面的热门话题。]
根据所涉及的工作,有时操作速度可以大大加快。至少,您可以这样对待任务,使它们在等待完成时不会阻碍其他工作。
在本文中,我们将探索利用Python中线程和子进程的最快方法之一,即线程和进程池。
Python线程和Python流程Python线程是一个相互独立运行的工作单元。但是,它们并不对应CPU上的硬件线程——至少在CPython中不是。Python线程由GIL控制,所以它们可以串行运行。因为一次只有一个Python线程运行,所以它们是组织需要等待的任务的有用方法。例如,Python可以在线程B等待外部系统回复的同时执行线程A或线程C。
Python进程是独立运行的Python解释器的完整实例。每个Python进程都有自己的GIL和要处理的数据副本。这意味着多个Python进程可以在独立的硬件核心上并行运行。代价是Python进程的启动时间比Python线程长。
在Python线程和Python进程之间进行选择的方法如下:
如果要执行长时间运行的I / O绑定操作,涉及等待Python之外的服务的任务(比如多个并行Web抓取或者文件处理作业)会用到线程。如果执行的是由C编写的外部库(如NumPy)处理的长时间运行的CPU绑定操作,请使用线程(因为这里的工作也是在Python之外完成的)。如果希望在Python中执行长时间运行的CPU绑定操作,请使用进程。Python线程池和Python进程池使用Python线程和Python进程处理各种作业最简单的方法就是使用Python的池对象。Pool允许您定义一组线程或进程(由您选择),并且您可以提供任意数量的作业,这些作业将按照完成的顺序返回结果。
例如,让我们列出从1到100的数字,从中构造URL,然后并行获取它们。这个例子受到I/O的约束,所以线程或进程的使用可能没有明显的性能差异,但是基本思想应该是清楚的。
# Python 3.5
from multi processing . dummy import Pool as thread Pool from urllib . request import urlopendef Run _ tasks(function,args,Pool,chunk _ size=None):results=Pool . map(function,args,chunk _ size)return results def work(n):with urlopen( https://www . Google . com/# { n } )as f:contents=f . read(32)return contents if _ _ name _ _== _ _ main _ _ :numbers=[x for x in range T _ p) print (result) t _ p.close () #使用进程池运行任务p _ p=process pool()result=run _ tasks(work,numbers,p _ p)print(result)p _ p . close()Python多重处理示例上述示例的工作方式如下:
多重处理模块为线程(多重处理. dummy)和进程(多重处理)提供了池对象。使用多处理的一个好处是线程和子进程使用相同的API,因此您可以创建可以同时使用的函数,如下所示。
T_p和p_p是ThreadPool和ProcessPool的实例。两者都作为任务的池类型传递给run_tasks。默认情况下,每个池实例在每个可用的CPU内核上使用一个线程或进程。创建一个池有一定的开销,所以不要过度使用它。如果要长时间处理大量作业,请先创建该池,在完成之前不要处理它。您可以通过调用。close()函数。
Pool.map()是我们用来细分作品的函数。Pool.map()接收一个函数,该函数带有应用于该函数每个实例的参数列表,将工作拆分成多个块(可以指定块大小;默认情况下通常是好的),然后将每个块送入一个工作线程或进程。
通常,map会阻塞正在运行的线程,这意味着在map返回完成的工作之前,您不能做任何其他事情。如果要异步运行map,请提供一个回调函数,当它的所有作业完成时运行,并使用map_async。
最后,这个基本的例子只涉及拥有自己状态的线程和进程。如果您有一个长时间运行的CPU绑定操作,其中线程或进程需要彼此共享信息,请考虑对共享内存或服务器进程使用多处理。
一般来说,对要处理和处理的数据进行的分区越多,一切运行的速度就越快。无论使用哪种语言,这都是多处理多线程的基本规则。
翻译自:3359 www . infoworld . com/article/3315121/python-threading-and-subprocesses-explained . html
Python中断子线程
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。