不可以,python目前不适合多线程在多核上运行。只能使用单核。如果需要多核,可以考虑多进程模式。
不同的线程创建不同的驱动程序,或者它们可以创建相同的驱动程序。
python的优势不包括以下内容:
多线程和速度
python的整体性能较慢,有限的线程和多处理能力是其未来发展的主要障碍。
python长期以来重视编程的容易程度,而不是运行时的速度。当你通过用c或c写的高速外部库(比如numpy和numba)在python中完成这么多性能密集型的任务时,你会发现python注重编程的易用性,这也是一个不错的选择。然而,python的开箱即用性能还是落后于其他语言,比如nim和julia,它们的语法一样简单,但是可以编译成机器码,具有更高的性能优势。
python可以不能充分利用多核处理器,这是一个由来已久的问题。它确实有线程功能,但是它的线程功能仅限于单核。尽管python可以使用多个流程,但是调度和同步这些子流程的结果并不总是有效的。
打包和可执行文件
即使在python的诞生,python仍然没有很好的方法生成可执行文件(
什么是线程?你为什么想要它?本质上,python是一种线性语言,但是当你需要更多的处理能力时,线程模块就会派上用场。python中的线程虽然不能用于并行cpu计算,但是非常适合web抓取等i/o操作,因为处理器是空闲的,在等待数据。
线程改变了游戏规则,因为许多与网络/数据i/o相关的脚本花费大部分时间等待来自远程源的数据。因为下载可能没有链接(即抓取一个单独的网站),所以处理器可以从不同的数据源并行下载,最后合并结果。对于cpu密集型进程,使用线程模块没有什么好处。
幸运的是,标准库中包含了线程:
可以使用targ:,这基本上是一种确保嵌入其中的代码只有在脚本直接运行(而不是导入)的情况下才能运行的方法。
锁你通常希望你的线程能够使用或修改线程间的公共变量,但是要做到这一点,你必须使用一个叫做锁的东西。每当一个函数试图修改一个变量时,它就锁定它。当另一个函数想要使用一个变量时,它必须等到该变量被解锁。
想象两个函数迭代变量1。使用锁可以确保一个函数可以访问变量、执行计算并写回变量,然后另一个函数才能访问同一个变量。
使用线程模块时,打印时也会发生这种情况,因为文本可能会变得混乱(并导致数据损坏)。您可以使用打印锁来确保一次只能打印一个线程。
在这里,我们有10项工作要做,5名工人将完成这项工作。
多线程并不总是完美的解决方案。我发现许多指导者倾向于忽略使用他们刚刚试图教你的工具的负面影响。理解使用所有这些工具有利也有弊是很重要的。例如:
与管理线程相关的开销很高,所以您不需要。;t不想用它做基本任务(比如例子);
它增加了程序的复杂性,这将使调试更加困难。
什么是多重处理?和螺纹有什么区别?如果没有多重处理,python程序将不能最大化系统的规格,因为gil(全局解释器锁定)。在设计python时,没有考虑到个人计算机可能有多个内核(向您展示了该语言的时代),所以gil是必要的,因为python不是线程安全的,并且在访问python对象时有一个全局强制锁。虽然它并不完美,但它是一种非常有效的内存管理机制。我们能做什么?
多重处理允许你创建可以同时运行的程序(绕过gil)并使用整个cpu内核。虽然和线程库有本质的区别,但是语法非常相似。多处理库为每个进程提供了自己的python解释器和gil。
因此,与线程相关的常见问题(如数据损坏和死锁)不再是问题。因为进程不共享内存,所以它们不能同时修改同一个内存。
让开始:如果您有一个共享数据库,请确保在开始一个新进程之前等待相关进程完成。
如果您想向进程传递参数,可以使用args。
这是一个简明的例子,因为您会注意到数字并没有按照您期望的顺序排列。
像线程一样,多重处理也有它的缺点...您必须选择它:
数据在进程间的随机移动会导致i/o开销。整个内存被复制到每个子进程,这可能会给更重要的程序造成大量开销。你应该用什么?如果你的代码有很多i/o或网络使用:
多线程是您的最佳选择,因为如果您有gui,它的开销非常低。
多线程,所以你的ui线程不会被锁定。如果您的代码受到cpu的限制:
你应该使用多重处理(如果你的电脑有多个核心)。