在使用多进程模块时,是否可以让一个进程导入另一个库?例如:
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()
我只需要“寄生”模块中的“寄生”程序。是否可以让他们在运行时导入该模块?在
只需反转防止进程创建的无限循环所需的习惯用法。。在
但是,您可能会发现,更容易让您的库加载更快,只需在主文件中执行,以避免各种荒谬的范围界定问题。这可以通过在子进程启动后需要一个单独的
Moo.initialize()
调用来实现,但是由于内存不是共享的,因此它需要由每个子进程执行。在一个好的一般经验法则是库不应该在导入上做任何实际的工作,这样就可以快速加载它们。一旦调用库中的某个函数,你就必须从库中调用。在
为了产生子进程,
multiprocessing
在UNIX中使用fork()
,并在Windows中使用特殊参数运行程序,该程序调用试图模拟相同行为的特殊代码。在因此,当创建子进程时,它们实际上不会再次初始化,父进程加载的所有模块也已经为它们加载了。在
因此,如果要导入模块:
import
它在工作函数内import
它在master中import
它在master中,然后del
生成的变量(这样它就不会污染master的名称空间),然后{sys.modules
中的现有模块对象)相关问题 更多 >
编程相关推荐