From: David H. <dav...@gm...> - 2008-01-08 22:52:47
|
I would like to run multiple independent Jython runtimes, with different Python source paths and independent, non-interacting module namespaces. Different runtimes will contain modules with the same name but different content -- slightly different or completely different. No settings, caches, data, or anything else that might vary from one runtime to the next should be shared. At first glance, it should be possible to achieve this by using a different classloader to load the Jython classes for each runtime. Since versions of the same class loaded by different classloaders are not only independent but type incompatible to boot, a copy of the Jython library loaded through one classloader should have no interaction with a copy of the Jython library loaded through another classloader. However, this ignores the possibility that the two runtimes might interact with each other through JRE classes -- there is only one version of each JRE class, loaded through a single classloader. (Actually, I don't know if it is necessary in principle, but it is necessary for other parts of my application to interact with my Jython code.) So there could still be conflicts, especially since some information in Jython gets cached in the current thread state. As far as I can tell, though, the thread-local information in Jython is contained in thread-local variables in instances of classes loaded from jython.jar and should therefore not result in collisions. (I.e., it is not stored using a pthreads-style key-value mapping stored in a JRE object somewhere.) In any case, interactions that result in Jython class instances from one runtime being passed to the other should result in ClassCastExceptions, not silent corruption. With that preamble: 1. Does anyone happen to know a reason why it would be impossible to create multiple independent runtimes using Jython? 2. Is anyone confident that it can be done? 3. Has anyone actually done it? I have made a first try at it, but I've hit a problem. Specifically, I have two runtimes that both contain a top-level module foo. Runtime A contains the module foo.bar, but runtime B contains the module foo.baz. Runtime B is initialized first and seems to run okay. Then, when I attempt to instantiate the class foo.bar.Bar in runtime A, the import of Bar succeeds, the Bar constructor runs successfully, but when the runtime attempts to initialize the proxy, it cannot find bar in foo. Debugging reveals that the foo module consulted during the proxy initialization contains baz, but not bar. So some kind of cross-talk is happening between the two runtimes, and no ClassCastExceptions are thrown. It might very well be due to a problem in my code, but I have worked on it far enough that I figured I should ask for input before proceeding further. Any information would be much appreciated! -David |