Questions tagged «multiprocessing»

多处理是在单个计算机系统中使用两个或多个中央处理单元(CPU)。相关的实现和用法细节因操作系统和编程语言而异。因此,在使用此标签时,请始终为操作系统和语言添加标签。

5
使用Python多处理解决令人尴尬的并行问题
如何使用多重处理来解决令人尴尬的并行问题? 令人尴尬的并行问题通常包括三个基本部分: 读取输入数据(从文件,数据库,tcp连接等)。 在输入数据上运行计算,其中每个计算独立于任何其他计算。 将计算结果写入文件,数据库,TCP连接等。 我们可以在两个方面并行化程序: 第2部分可以在多个内核上运行,因为每个计算都是独立的。处理顺序无关紧要。 每个部分可以独立运行。第1部分可以将数据放在输入队列中,第2部分可以将数据从输入队列中拉出并将结果放到输出队列中,第3部分可以将结果从输出队列中拉出并写出。 这似乎是并发编程中最基本的模式,但是我仍然在尝试解决它方面迷失了方向,因此让我们写一个规范的示例来说明如何使用多重处理来完成。 这是示例问题:给定一个以整数行作为输入的CSV文件,计算其总和。将问题分为三个部分,这些部分可以并行运行: 将输入文件处理为原始数据(整数列表/可迭代数) 并行计算数据总和 输出总和 下面是传统的单进程绑定Python程序,它解决了这三个任务: #!/usr/bin/env python # -*- coding: UTF-8 -*- # basicsums.py """A program that reads integer values from a CSV file and writes out their sums to another CSV file. """ import csv import optparse import sys def …

3
多处理for循环?
我有一个数组(称为data_inputs),其中包含数百个天文学图像文件的名称。然后处理这些图像。我的代码有效,并且需要几秒钟来处理每个图像。但是,一次只能执行一张图像,因为我是通过for循环运行阵列: for name in data_inputs: sci=fits.open(name+'.fits') #image is manipulated 没有理由我必须先修改映像,因此是否有可能利用计算机上的所有4个内核,每个内核都通过for循环在不同的映像上运行? 我已经阅读了有关该multiprocessing模块的信息,但是不确定如何在我的情况下实现它。我渴望开始multiprocessing工作,因为最终我将不得不在10,000幅以上的图像上运行它。

3
处理多个进程中的单个文件
我有一个大文本文件,我想在其中处理每一行(执行一​​些操作)并将它们存储在数据库中。由于单个简单程序花费的时间太长,我希望它可以通过多个进程或线程来完成。每个线程/进程应从单个文件中读取不同的数据(不同的行),并对它们的数据(行)进行一些操作,然后将它们放入数据库中,以便最后,我处理完所有数据,数据库随我需要的数据一起转储了。 但是我无法弄清楚如何解决这个问题。

4
具有多处理功能的Celery并行分布式任务
我有一个CPU密集的Celery任务。我想使用许多EC2实例上的所有处理能力(核心)来更快地完成此工作(我认为是具有多处理功能的芹菜并行分布式任务)。 我想更好地理解所有术语,线程,多处理,分布式计算,分布式并行处理。 示例任务: @app.task for item in list_of_millions_of_ids: id = item # do some long complicated equation here very CPU heavy!!!!!!! database.objects(newid=id).save() 使用上面的代码(如果可能,还提供一个示例),如何通过Celery使用一项计算任务来拆分这项任务?

2
Python多处理安全地写入文件
我正在尝试解决一个涉及许多子问题的大数值问题,并且我正在使用Python的多处理模块(特别是Pool.map)将不同的独立子问题分解为不同的核心。每个子问题都涉及计算大量子问题,并且我试图通过将结果存储到文件中(如果尚未通过任何过程对其进行计算)来有效地记住这些结果,否则请跳过计算并仅从文件中读取结果。 我的文件存在并发问题:有时,不同的过程会检查以查看是否已经计算了子子问题(通过查找将结果存储在文件中),没有找到子子问题,运行计算,然后尝试同时将结果写入同一文件。如何避免这样写冲突?

3
使用multiprocessing.Process并发进程数最多
我有Python代码: from multiprocessing import Process def f(name): print 'hello', name if __name__ == '__main__': for i in range(0, MAX_PROCESSES): p = Process(target=f, args=(i,)) p.start() 运行良好。但是,MAX_PROCESSES是变量,可以是1和之间的任何值512。由于我仅在具有8内核的计算机上运行此代码,因此我需要确定是否有可能限制允许同时运行的进程数。我已经调查过了multiprocessing.Queue,但看起来不像我需要的东西-也许我在错误地解释了文档。 有没有一种方法可以限制同时multiprocessing.Process运行的数量?


4
多处理中的共享内存
我有三个大名单。前一个包含位数组(模块位数组0.8.0),另外两个包含整数数组。 l1=[bitarray 1, bitarray 2, ... ,bitarray n] l2=[array 1, array 2, ... , array n] l3=[array 1, array 2, ... , array n] 这些数据结构占用相当多的RAM(总计约16GB)。 如果我使用以下方法启动12个子流程: multiprocessing.Process(target=someFunction, args=(l1,l2,l3)) 这是否意味着将为每个子流程复制l1,l2和l3,或者子流程将共享这些列表?或者更直接地说,我将使用16GB还是192GB的RAM? someFunction将从这些列表中读取一些值,然后根据读取的值执行一些计算。结果将返回到父进程。列表l1,l2和l3不会被someFunction修改。 因此,我假设子流程不需要并且不会复制这些庞大的列表,而只会与父级共享它们。意味着由于linux下的写时复制方法,该程序将占用16GB的RAM(无论我启动了多少个子进程)?我是对的还是我遗漏了一些会导致列表被复制的东西? 编辑:在阅读了有关该主题的更多内容后,我仍然感到困惑。一方面,Linux使用写时复制,这意味着没有数据被复制。另一方面,访问对象将更改其引用计数(我仍然不确定为什么以及这意味着什么)。即使这样,会复制整个对象吗? 例如,如果我定义someFunction如下: def someFunction(list1, list2, list3): i=random.randint(0,99999) print list1[i], list2[i], list3[i] 使用此功能是否意味着将为每个子流程完全复制l1,l2和l3? 有办法检查吗? EDIT2在多了一点并监视子进程运行时系统的总内存使用情况之后,似乎确实为每个子进程复制了整个对象。这似乎是因为引用计数。 在我的程序中,实际上不需要l1,l2和l3的引用计数。这是因为l1,l2和l3将保留在内存中(不变),直到父进程退出。在此之前,无需释放这些列表使用的内存。实际上,我可以肯定的是,在程序退出之前,引用计数将保持高于0(对于这些列表和这些列表中的每个对象)。 所以现在的问题变成了,我如何确保对象不会复制到每个子流程?我是否可以禁用这些列表以及这些列表中每个对象的引用计数? EDIT3只是一个附加说明。子进程并不需要修改l1,l2并l3或在这些列表中的任何对象。子流程仅需要能够引用其中一些对象,而无需为每个子流程复制内存。

9
未检测到在多处理池中引发的异常
看来,当从multiprocessing.Pool进程引发异常时,没有堆栈跟踪或任何其他指示其已失败的迹象。例: from multiprocessing import Pool def go(): print(1) raise Exception() print(2) p = Pool() p.apply_async(go) p.close() p.join() 打印1并静默停止。有趣的是,引发BaseException可以工作。有什么办法可以使所有异常的行为与BaseException相同?


24
多任务,多线程和多处理之间的区别?[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 12天前关闭。 改善这个问题 多任务,多程序和多处理之间有什么区别 这是我的大学操作系统考试中经常出现的问题,我找不到很好的答案。我对多任务和多编程了解很多,但需要确认。

5
Python多处理和共享计数器
我在多处理模块上遇到了麻烦。我正在使用具有其map方法的工作人员池从大量文件中加载数据,对于每个文件,我都使用自定义函数来分析数据。每次处理文件时,我都希望更新一个计数器,以便可以跟踪还有多少文件需要处理。这是示例代码: def analyze_data( args ): # do something counter += 1 print counter if __name__ == '__main__': list_of_files = os.listdir(some_directory) global counter counter = 0 p = Pool() p.map(analyze_data, list_of_files) 我找不到解决方案。

5
与多处理错误的另一个混淆是,“模块”对象没有属性“ f”
我知道这已经得到了回答,但是直接执行脚本“ python filename.py”似乎不起作用。我在SuSE Linux上有Python 2.6.2。 码: #!/usr/bin/python # -*- coding: utf-8 -*- from multiprocessing import Pool p = Pool(1) def f(x): return x*x p.map(f, [1, 2, 3]) 命令行: > python example.py Process PoolWorker-1: Traceback (most recent call last): File "/usr/lib/python2.6/multiprocessing/process.py", line 231, in _bootstrap self.run() File "/usr/lib/python2.6/multiprocessing/process.py", line 88, in …
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.