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

带有工作进程的python池

贺聪
2023-03-14
问题内容

我正在尝试使用Process对象在python中使用工作池。每个工作人员(一个流程)进行一些初始化(花费很短的时间),传递一系列的工作(最好使用map()),然后返回一些信息。除此之外,没有必要进行任何沟通。但是,我似乎无法弄清楚如何使用map()使用工作人员的compute()函数。

from multiprocessing import Pool, Process

class Worker(Process):
    def __init__(self):
        print 'Worker started'
        # do some initialization here
        super(Worker, self).__init__()

    def compute(self, data):
        print 'Computing things!'
        return data * data

if __name__ == '__main__':
    # This works fine
    worker = Worker()
    print worker.compute(3)

    # workers get initialized fine
    pool = Pool(processes = 4,
                initializer = Worker)
    data = range(10)
    # How to use my worker pool?
    result = pool.map(compute, data)

是代替工作队列map()吗,还是可以使用?


问题答案:

我建议您为此使用队列。

class Worker(Process):
    def __init__(self, queue):
        super(Worker, self).__init__()
        self.queue = queue

    def run(self):
        print('Worker started')
        # do some initialization here

        print('Computing things!')
        for data in iter(self.queue.get, None):
            # Use data

现在您可以开始一堆这些工作,所有工作都从一个队列开始

request_queue = Queue()
for i in range(4):
    Worker(request_queue).start()
for data in the_real_source:
    request_queue.put(data)
# Sentinel objects to allow clean shutdown: 1 per worker.
for i in range(4):
    request_queue.put(None)

这种事情应该可以让您分摊多名员工的昂贵启动成本。



 类似资料:
  • 我已经用JavaFX创建了我的应用程序。一切都很好,所以我使用Jpackage在Windows中制作了一个可安装的应用程序版本。 在我安装包之后,Windows计算机仍然要求安装JVM。 我的期望是,我可以使用Jpackage在任何计算机上安装我的JavaFX应用程序,并自动设置JVM。。用户只需点击图标并运行应用程序。 关于Jpackage中的正确命令的任何建议,以将我的JavaFX应用程序ja

  • 我有一个带有进度条的组合框示例。 我想在应用程序运行时显示一个进度条,其中包含正在运行的后台进程。当我将鼠标移到进度条上时,我想看到所有进程。但由于某些原因,代码无法正常工作-当我选择进度条时,没有显示进度条。你能帮我识别这个密码吗。

  • 我对spring boot和创建我的第一个应用程序非常陌生。创建数据源时,我使用了带有前缀的@ConfigurationProperties和要从Application.Property中读取的属性。 但是,这个设置似乎对我不起作用,我的程序没有运行。 我的pom.xml文件包含: 我的存储库类: 我的主要类: 请让我知道如果我需要提供任何其他信息以及。

  • 我必须分叉两个子进程,其中SIGINT命令被阻塞,但其中一个在接收到SIGTERM信号时应该解除阻塞,而另一个子进程和父进程都会打印它们的PID,作为相同SIGTERM信号的结果。第二个子进程应立即终止,但父进程应等待其子进程结束,然后停止。 我刚开始在Linux中学习C编程,但我并不真正理解分叉和信号是如何工作的。据我所知,我编写的这段代码将派生一个进程,子进程将阻止Ctrl-C命令,整个过程将

  • 与服务人员一起进行脱机工作,从https://angular.io/guide/service-worker-config 应用程序脱机工作正常唯一的问题是,如果我使用应用程序脱机工作正常,但缓存中的文件在服务器上的文件更新时从不更新。如果我使用“installMode”:“lazy”`应用程序无法脱机工作。 以下是。 还尝试了,但仍然缓存未在更改时更新的文件

  • 我发现有一个老问题sleuth/zipkin用@controlleradvice跟踪,但我在最新版本(spring-cloud-starter-zipkin:2.1.0.release)中遇到了同样的问题,我调试了它,发现错误为null,所以zipkin只是用statuscode猜测。我必须再次抛出异常以使zipkin通知异常 错误为空 zipkin结果 控制器建议 再次抛出异常,它起作用了