在主进程和工作进程中导入不同的模块集

2024-04-26 03:49:02 发布

您现在位置:Python中文网/ 问答频道 /正文

在使用多进程模块时,是否可以让一个进程导入另一个库?例如:

import multiprocessing as mp
import pprint
import sys
import threading

from Foo import Moo

class Worker(mp.Process):
    def __init__(self):
        print "Worker Init"
        mp.Process.__init__(self)

    def run(self):
        print "Worker Running"
        self._static_method()

    @staticmethod
    def _static_method():
        print "I'm a-static, get it?"

class TouchWorker(threading.Thread):
    def __init__(self):
        super(TouchWorker, self).__init__(name="Touchoo" + " TouchWorker")

    def run(self):
        print "Touchoo Running"

class Parasite(mp.Process):
    def __init__(self):
        print "Parasite Init"
        mp.Process.__init__(self)

    def run(self):
        print "Parasite Running"

class Encapsulator(object):
    def __init__(self):
        workers = []

        for _ in range(4):
            wrk = Worker()
            workers.append(wrk)

        for someWorker in workers:
            someWorker.start()

        par = Parasite()
        par.start()

if __name__ == '__main__':
    enc = Encapsulator()

我只需要“寄生”模块中的“寄生”程序。是否可以让他们在运行时导入该模块?在


Tags: 模块runimportselfinitdefstaticmp
2条回答

只需反转防止进程创建的无限循环所需的习惯用法。。在

# this should look familiar
if not __name__ == "__main__":
     from Foo import Moo

但是,您可能会发现,更容易让您的库加载更快,只需在主文件中执行,以避免各种荒谬的范围界定问题。这可以通过在子进程启动后需要一个单独的Moo.initialize()调用来实现,但是由于内存不是共享的,因此它需要由每个子进程执行。在

一个好的一般经验法则是库不应该在导入上做任何实际的工作,这样就可以快速加载它们。一旦调用库中的某个函数,你就必须从库中调用。在

为了产生子进程,multiprocessing在UNIX中使用fork(),并在Windows中使用特殊参数运行程序,该程序调用试图模拟相同行为的特殊代码。在

因此,当创建子进程时,它们实际上不会再次初始化,父进程加载的所有模块也已经为它们加载了。在

因此,如果要导入模块:

  • 在主人身上而不是在工人身上:
    • 不可能,完全没有必要。您所能做的就是使引用模块的变量对工人不可见
  • 但不在master中:
    • import它在工作函数内
      • 导入将在每个工作线程中完成,或者
    • import它在master中
      • 导入将在master中完成一次,并且子级将自动继承它,或者
    • import它在master中,然后del生成的变量(这样它就不会污染master的名称空间),然后{}再次在workers中(这将重用sys.modules中的现有模块对象)

相关问题 更多 >