reloading code and multiprocessing

88888 Dihedral 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
>     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