reloading code and multiprocessing
88888 Dihedral
dihedral88888 at googlemail.com
Thu Jul 19 11:08:49 EDT 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
> print(a.ret())
>
>
> 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)
> p1.start()
> res = p1.join()
> open(path.join(cur_dir, 'a.py'), 'w').write(new_a)
> remove(path.join(cur_dir, 'a.pyc'))
>
> p2.start()
> 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.
or
More information about the Python-list
mailing list