Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python线程和性能?_Python_Performance_Multithreading - Fatal编程技术网

python线程和性能?

python线程和性能?,python,performance,multithreading,Python,Performance,Multithreading,我必须执行繁重的I/o绑定操作,即解析大型文件并从一种格式转换为另一种格式。起初,我习惯于按顺序进行解析,即一个接一个地解析。。!性能非常差(过去需要90多秒)。所以我决定使用线程来提高性能。我为每个文件创建了一个线程。(4个螺纹) 但令我惊讶的是,没有任何性能改进。现在,完成这项任务大约需要90多秒。由于这是I/o绑定的操作,我本来希望提高性能。线程化允许操作系统为您的程序分配更多的CPU内核。如果是I/O限制,这意味着速度受I/O系统速度而不是CPU速度的限制。在这种情况下,分配更多的CPU

我必须执行繁重的I/o绑定操作,即解析大型文件并从一种格式转换为另一种格式。起初,我习惯于按顺序进行解析,即一个接一个地解析。。!性能非常差(过去需要90多秒)。所以我决定使用线程来提高性能。我为每个文件创建了一个线程。(4个螺纹)


但令我惊讶的是,没有任何性能改进。现在,完成这项任务大约需要90多秒。由于这是I/o绑定的操作,我本来希望提高性能。

线程化允许操作系统为您的程序分配更多的CPU内核。如果是I/O限制,这意味着速度受I/O系统速度而不是CPU速度的限制。在这种情况下,分配更多的CPU内核并不一定有帮助-您仍然在等待I/O子系统。

在通常的Python解释器下,线程将不会分配更多的CPU内核给您的程序,因为(又称GIL)

这个模块可以帮助你。(请注意,它是在Python2.6中引入的,但Python2.5中存在后台端口。)

正如MSalters所说,如果您的程序是I/O绑定的,那么这是否有用还有争议。但也许值得一试:)

要使用此模块实现您的目标,请执行以下操作:

import multiprocessing

MAX_PARALLEL_TASKS = 8 # I have an Intel Core i7 :)

pool = multiprocessing.Pool(MAX_PARALLEL_TASKS)

pool.map_async(convertfile, filelist)

pool.close()
pool.join()
重要传递给
map\u async
的函数必须是可pickle的。通常情况下,实例方法是不可pickle的,除非您将它们设计成这样!请注意,上面的
convertfile
是一个函数


如果您确实需要从
convertfile
获取结果,也有一些方法可以做到这一点。多处理文档页面上的示例应该澄清。

但我相信线程切换是在线程等待I/o subsyetm时发生的,不是吗?因此,我现在正在并行处理这些事情,这意味着我可以期望一些性能改进??Python中的线程不会为程序分配更多的CPU内核。@kumar:正如回复所说,如果您受到I/O限制-您的I/O将尽可能地困难-更多的CPU时间或并行处理不会使I/O提前完成。谢谢delty..但是多处理模块有它自己的问题。1) 我必须重构我的代码,因为我不能使用实例方法。。2) 我有一个实例方法,它有许多文件处理程序。这些文件处理程序在子进程中关闭,这是不可接受的。所以我需要再次打开它们。不幸的是,我没有办法知道它们,因为它们是在实例化过程中传递的,不必是在单独的过程中执行的转换函数本身。有什么方法可以在单独的流程中完成实例化部分吗?例如,编写一个函数,甚至是一个单独的脚本,进行一次实例化和转换;然后编写一个“主脚本”,使用多处理模块运行这些函数。可以使用模块运行单独的脚本。如果有很多共享数据,那么是的,这就是多处理变得复杂的地方。但该模块中还有很多工具:)
import multiprocessing

MAX_PARALLEL_TASKS = 8 # I have an Intel Core i7 :)

pool = multiprocessing.Pool(MAX_PARALLEL_TASKS)

pool.map_async(convertfile, filelist)

pool.close()
pool.join()