cho*_*pay 4 python multiprocessing python-2.7
试图更好地理解这一点: https://pymotw.com/2/multiprocessing/basics.html
我有 20 多个“大”日志(每个日志大约 6-9gig,但经过压缩,即 log1...20.gz)
我的 python 脚本将遍历指定目录中的每个日志并计算出特定列的总数,然后写入文件并继续到下一个日志文件。我注意到,当我这样做时,我并没有使用系统中的所有核心。所以为了使用更多的核心,我这样做了
script1.py < folder 1 (contains logs 1-5 , write to report1-5.txt)
script2.py < folder 2 (contains logs 6-10, write to report6-10.txt)
script3.py < folder 3 (contains logs 11-15, write to report11-15.txt)
script4.py < folder 4 (contains logs 16-20, write to report16-20.txt
Run Code Online (Sandbox Code Playgroud)
理想情况下,我只会有 script1.py < 文件夹 1 (包含所有 20 个日志并写入 report.txt)
如果我启用“导入多重处理”,我是否能够实现拥有 1 个脚本和许多工作人员浏览不同文件,或者是否有许多工作人员尝试处理 sale log.gz 文件?还是我误解了这些信息
如果我正确理解您的问题,那么您正在寻找一种加速 gzip 压缩日志文件处理速度的好方法。
您需要回答的第一个问题是您当前的进程是 CPU 密集型还是 IO 密集型。这意味着:当您当前运行script.py < folder 1并使用 例如 观察它时top,您的进程是否达到 100% CPU 使用率?如果是,则您的进程受 CPU 限制(即 CPU 是瓶颈)。如果是这种情况,那么 python 中的并行化将对您有所帮助。如果不是(而且它肯定不是,因为光盘将成为您的瓶颈,除非 gz 文件位于不同的磁盘上),那么您无需费心,因为您不会从中获得更快的速度。
要并行化,您基本上有两种选择:
python:您需要按照您的建议使用多重处理。但要实现这一点,您不能只导入多处理,您需要明确说明每个进程需要做什么,例如:
from multiprocessing import Pool, Queue
def crunch_file(queue):
while not queue.empty()
filename = queue.get()
# gunzip file, do processing, write to reportx-y.txt
if __name__ == '__main__':
queue = Queue()
# put all filenames into queue with os.walk() and queue.put(filename)
pool = Pool(None, crunch_file, (queue,))
pool.close() # signal that we won't submit any more tasks to pool
pool.join() # wait until all processes are done
Run Code Online (Sandbox Code Playgroud)
有几点需要注意:
Pool(None, ...)python 将计算出您拥有的核心数量,并将为每个 cpu 核心启动一个进程Queue可以帮助您永远不会有空闲进程:如果其中一个进程完成了他的文件,它将占用队列中的下一个进程bash:因为你似乎不熟悉Python的多处理,并且不同的进程不需要互相交谈,所以更容易的是并行启动例如4个Python程序,例如
script.py < folder 1 &
script.py < folder 2 &
script.py < folder 3 &
script.py < folder 4 &
Run Code Online (Sandbox Code Playgroud)