当前位置: 首页 > 面试题库 >

python multiprocessing apply_async仅使用一个进程

叶煌
2023-03-14
问题内容

我有一个脚本,其中包括从列表中打开文件,然后对该文件中的文本进行处理。我正在使用python
multiprocessing和Pool尝试并行化此操作。脚本的抽象如下:

import os
from multiprocessing import Pool

results = []
def testFunc(files):
    for file in files:
        print "Working in Process #%d" % (os.getpid())
        #This is just an illustration of some logic. This is not what I'm actually doing.
        for line in file:
            if 'dog' in line:
                results.append(line)

if __name__=="__main__":
    p = Pool(processes=2)
    files = ['/path/to/file1.txt', '/path/to/file2.txt']
    results = p.apply_async(testFunc, args = (files,))
    results2 = results.get()

运行此命令时,每次迭代的进程ID的打印均相同。基本上,我想做的是获取输入列表中的每个元素并将其分叉到一个单独的进程中,但是似乎一个进程正在完成所有工作。


问题答案:
  • apply_async将一项任务分配到池中。您将需要apply_async多次调用 才能使用更多处理器。
  • 不允许两个进程尝试写入同一列表 results。由于池工作程序是独立的进程,因此这两个进程将不会写入同一列表。解决此问题的一种方法是使用输出队列。您可以自行设置,也可以使用apply_async的回调为您设置Queue。apply_async函数完成后将调用回调。
  • 您可以使用map_async而不是apply_async,但是您将获得一个列表列表,然后必须对其进行展平。

因此,也许尝试改用类似的方法:

import os
import multiprocessing as mp

results = []

def testFunc(file):
    result = []
    print "Working in Process #%d" % (os.getpid())
    # This is just an illustration of some logic. This is not what I'm
    # actually doing.
    with open(file, 'r') as f:
        for line in f:
            if 'dog' in line:
                result.append(line)
    return result


def collect_results(result):
    results.extend(result)

if __name__ == "__main__":
    p = mp.Pool(processes=2)
    files = ['/path/to/file1.txt', '/path/to/file2.txt']
    for f in files:
        p.apply_async(testFunc, args=(f, ), callback=collect_results)
    p.close()
    p.join()
    print(results)


 类似资料:
  • 我正在尝试使用Office 365 API将事件写入我们组织中任何人的日历。这不应涉及用户在任何时候登录Office 365。要添加的事件在一天中的不同时间点被写出来(当拥有事件的用户可能甚至不在计算机上时),因此每用户令牌方法甚至没有意义。 微软似乎提供了一种使用服务帐户的替代方案。此帐户可用于写入任何用户的日历(或以任何用户身份发送电子邮件等)。但是,我找不到有关执行此操作的任何文档。任何人都

  • 问题内容: 我在Linux机器上运行一个python脚本,该脚本使用subprocess.check_output()创建一个子进程,如下所示: 问题是,即使父进程死亡,子进程仍在运行。父母去世后,我还有什么办法可以杀死子进程? 问题答案: 您的问题是使用-是正确的,您无法使用该接口获取子PID。改用Popen: 为确保您在出口处杀死孩子:

  • 我一直使用两个布局文件使用constraintlayout动画 然而,在布局中,我只更改了两个约束。我决定尝试以编程方式这样做,并且这样做了,这起作用了。 然而,这不是动画。我试着像之前在第一个中那样进行动画(这次只使用了一个布局文件),结果是这样的 这与第二个一样工作,但没有显示动画,新的约束立即跳入适当的位置。有没有什么方法可以让动画工作不使用两个layoyuts?还是我做错了什么?多谢了。

  • 问题内容: 我想的一个版本是只替换第一次出现的。是否有一个简单的解决方案,还是我需要一个hacky解决方案? 问题答案: 可以用preg_replace完成: 不可思议的地方是可选的第四个参数[Limit]。从文档中: [限制]-每个主题字符串中每个模式的最大可能替换量。默认为-1(无限制)。

  • 问题内容: 关于JDK 5的这个问题说,[DK 5没有提供任何实现,但是JDK 6应该有一个实现。 据我所知,该类未随JDK提供,并且无法在其中找到任何其他类似的类。 那么,JDK6的情况如何? 我知道有许多类似Commons和JBoss的实现,但是我们有一个严格的第三方lib策略,因此我试图避免重新发明轮子。 问题答案: 不,在Java 5和Java 6之间情况没有改变。 不幸的是,Java S

  • 问题内容: 我一直在做一个项目,内容已经完成。但是对于设计,我正在考虑使用视差滚动技术。 但是,我所能找到的全部还是JavaScript或Jquery,而我只精通CSS3。 可以仅使用CSS3(如果需要使用HTML5)而不是使用jquery插件来实现视差滚动吗?如果我能指出一些相同的教程,那就太好了。 注意:这接近于我想要产生的效果 问题答案: 要产生非常基本的视差滚动效果,下面的示例就足够了。