reloading code and multiprocessing
dihedral88888 at googlemail.com
Thu Jul 19 17:08:49 CEST 2012
andrea crotti於 2012年7月19日星期四UTC+8下午6時15分11秒寫道：
> We need to be able to reload code on a live system. This live system
> has a daemon process always running but it runs many subprocesses with
> multiprocessing, and the subprocesses might have a short life...
> Now I found a way to reload the code successfully, as you can see from
> this testcase:
> def func():
> from . import a
> class TestMultiProc(unittest.TestCase):
> def setUp(self):
> open(path.join(cur_dir, 'a.py'), 'w').write(old_a)
> def tearDown(self):
> remove(path.join(cur_dir, 'a.py'))
> def test_reloading(self):
> """Starting a new process gives a different result
> p1 = Process(target=func)
> p2 = Process(target=func)
> res = p1.join()
> open(path.join(cur_dir, 'a.py'), 'w').write(new_a)
> remove(path.join(cur_dir, 'a.pyc'))
> res = p2.join()
> As long as I import the code in the function and make sure to remove the
> "pyc" files everything seems to work..
> Are there any possible problems which I'm not seeing in this approach or
> it's safe?
> Any other better ways otherwise?
If a byte code interpreter is embedded in the executable, then the program
can obtain or reload code objects in the run time.
In C/C++, unless one can swap some DLL safely or spawn in another process with
new executables obtained from other places, or a script interpreter is embedded, otherwise it's not easy for an instance in C/C++ to get new methods dynamically.
More information about the Python-list