Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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_Multithreading_Multiprocessing - Fatal编程技术网

Python中的多线程/多处理

Python中的多线程/多处理,python,multithreading,multiprocessing,Python,Multithreading,Multiprocessing,我创建了一个简单的子字符串搜索程序,它递归地查找文件夹并扫描大量文件。该程序使用Boyer-Moore-Horspool算法,在解析大量数据时非常有效 链接到程序: 我现在想做的是让它更有效率。如果您查看代码,您会注意到有三个不同的目录正在被搜索。我希望能够创建一个并发搜索每个目录的进程/线程,这将大大加快我的程序 实现这一点的最佳方式是什么?我做了一些初步的研究,但是我的实现没有成功。它们似乎在经过25分钟左右的处理后就消失了(目前单进程版本运行几乎需要24小时;数据量很大,有648个独特的关

我创建了一个简单的子字符串搜索程序,它递归地查找文件夹并扫描大量文件。该程序使用Boyer-Moore-Horspool算法,在解析大量数据时非常有效

链接到程序:

我现在想做的是让它更有效率。如果您查看代码,您会注意到有三个不同的目录正在被搜索。我希望能够创建一个并发搜索每个目录的进程/线程,这将大大加快我的程序

实现这一点的最佳方式是什么?我做了一些初步的研究,但是我的实现没有成功。它们似乎在经过25分钟左右的处理后就消失了(目前单进程版本运行几乎需要24小时;数据量很大,有648个独特的关键字)

我使用多处理API做了各种实验,将所有不同的文件压缩成3个文件(每个目录一个),然后通过mmap()将文件映射到内存,但a:我不确定这是否是正确的路径,b:我的程序一直在随机点死亡,调试是一场噩梦

是的,我做过大量的谷歌搜索,但我对池/线程/子进程/多线程/多处理感到非常困惑

我不是要求你写我的程序,只是帮助我理解实施解决方案所需的思维过程。谢谢大家!


仅供参考:我计划在程序运行后开放源代码。我认为这是一个相当有用的脚本,而且在线提供的多处理的现实世界实现的例子也很有限。

该怎么做取决于是什么减慢了过程

如果您在单个磁盘上读取数据,而磁盘I/O正在使您的速度减慢,那么多个线程/进程可能只会使您的速度减慢,因为随着不同线程获得控制权,读取头将四处跳跃,并且您将花费比读取更多的时间来查找数据

如果您在单个磁盘上读取数据,而处理速度正在减慢,那么使用多处理来分析数据可能会加快速度,但是您仍然应该从单个线程读取数据,以避免寻道时间延迟(通常是很长、几毫秒)

如果您正在从多个磁盘读取数据,而磁盘I/O使您的速度变慢,那么多个线程或进程可能会提高速度。线程更容易,而且由于您的大部分延迟时间都远离处理器,GIL不会妨碍您


如果您正在从多个磁盘读取数据,并且处理速度减慢,那么您需要使用多处理。

多处理比多线程(IMO)更易于理解/使用。出于我的原因,我建议读一读陶普。基本上,一个线程所做的一切,一个进程所做的一切,只有程序员必须做操作系统所能处理的一切。共享资源(内存/文件/CPU周期)?学习线程的锁定/互斥/信号量等。如果您使用进程,操作系统会为您执行此操作

我建议建立4+个流程。1从硬盘中提取数据,另外三个从硬盘中查询数据以获取下一个数据。也许还有第五个过程可以把它们粘在一起

这很自然地符合我们的要求。请参见示例以及使用它的示例


同样在同一个站点上,请查看该部分。

我的建议是让目录在主线程中遍历,并在进程(或线程)池中进行文件处理。它肯定必须是多进程的,而不是线程,否则由于GIL,您将得不到任何好处。当程序在25分钟后死亡时,会发生什么情况?它结冰了吗?提出一个例外?我不认为您可能会耗尽内存,因此应该可以确定出现错误的确切位置。您的要求非常不明确。您想要多处理库的完整解释吗?试着阅读。它写得很好,应该包含所有需要的内容。离题:代码中有类似于
noluck=“false”
的内容。你知道python中有布尔类型
True
False
吗?@Simon-上周我第一次尝试python,谢谢你的提醒
所有文件都位于单个本地磁盘上。我的目标是将所有内容压缩到每个目录的一个文件中,以限制I/O瓶颈。大部分CPU时间延迟都花在解析文件上。OK。我编辑了我的答案,所以我认为我的第二个条目适用于你的情况。