Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.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_Python 3.x_Multithreading_Pyelftools - Fatal编程技术网

Python 在多个线程中处理同一文件

Python 在多个线程中处理同一文件,python,python-3.x,multithreading,pyelftools,Python,Python 3.x,Multithreading,Pyelftools,我试图加快用python处理文件所需的时间。我的想法是将任务分成n个线程 例如,如果我有一个包含1300项的文件。我希望每个线程处理每个第n项。每个项目都不依赖于任何其他项目,因此订单在这里并不重要 因此,每个线程的工作流都是这样的: 1) open file 2) iterate through items 3) if nth item then process, otherwise continue 我正在使用线程库来实现这一点,但没有看到任何性能改进 以下是伪代码: def driver

我试图加快用python处理文件所需的时间。我的想法是将任务分成n个线程

例如,如果我有一个包含1300项的文件。我希望每个线程处理每个第n项。每个项目都不依赖于任何其他项目,因此订单在这里并不重要

因此,每个线程的工作流都是这样的:

1) open file
2) iterate through items
3) if nth item then process, otherwise continue
我正在使用线程库来实现这一点,但没有看到任何性能改进

以下是伪代码:

def driver(self):
        threads = []
        # Just picked 10 as test so trying to create 10 threads
        for i in range(0,10):
            threads.append(threading.Thread(target=self.workerFunc, args=(filepath, i, 10)))

        for thread in threads:
            thread.start()

        for thread in threads:
            thread.join()

def workerFunc(self, filepath):
        with open(filepath, 'rb') as file:
                obj = ELFFile(file)
                for item in obj.items:
                        if (item is not nth item):
                                continue
                        else:
                                process this item
因为每个线程都只是读取文件,所以它应该能够自由地扫描文件,而不必关心其他线程正在做什么或被它们阻止,对吗

我在这里俯瞰什么

我能想到的唯一一件事是,我用来格式化这些文件的库(pyelftool-ELFFile)有一些内部阻塞,但我找不到它。或者我的计划有什么根本性的缺陷


编辑:请注意,我正在运行此功能的系统上有32个CPU

您不太可能获得任何性能优势。如果您正在处理文件,并且性能很重要,那么切换到性能更高的工具或语言进行处理是值得的。@jancristophterasa comment+1。您是否在
多处理
模块中尝试过类似的方法(可以实现实际的并行性)@kingkupps关于多处理的观点很好,但我发现,通常只有在不处理共享状态时,这才有用,也就是说,进程可以独立运行,并且最终聚合结果。但是,我发现只编写单进程Python代码并用于多处理比使用
多处理要容易得多。它还提供了将输入文件分割成块进行处理的功能。我的档案号码是500-600。我将它们分为8块(基于可用的CPU),并使用多处理。我认为当您使用多线程时,它不是真正的并行。例如,在Arduino微控制器中,I/O速度很慢,因此如果使用多线程,在I/O请求和响应之间,CPU将执行其他工作。在您的情况下,如果您有例如单核CPU,则不可能更快地完成该工作,因为它与执行该工作的CPU相同。其他人都在排队。我的建议是使用多重处理。