CPython中的子解释器API的目的是什么?

18

我不太清楚子解释器API存在的原因,以及为什么它会在诸如mod_wsgi Apache模块之类的模块中使用。它主要用于为在同一进程中运行的不同应用程序创建安全沙箱,还是允许多个线程并发?也许两者都有?还有其他目的吗?

2个回答

13

我想目的是创建单独的Python执行环境。例如,mod_wsgi(Apache Python模块)托管一个单独的Python解释器,然后在子解释器中托管多个应用程序(在默认配置中)。

根据文档,以下是几个关键点:

  • 这是完全独立于Python代码执行的环境(几乎)。特别地,新解释器具有所有导入模块的独立版本,包括基本模块 __builtin__, __main__sys
  • 已加载的模块表(sys.modules)和模块搜索路径(sys.path)也是独立的。
  • 由于子解释器(和主解释器)是同一进程的一部分,它们之间的隔离并不完全 - 例如使用底层文件操作如 os.close(),它们可以(无意或恶意地)影响彼此的打开文件。
  • 由于扩展在(子)解释器之间共享,某些扩展可能无法正常工作;尤其是当扩展使用(静态)全局变量或在初始化后操作其模块的字典时,这种情况尤其可能发生。

3
GIL是进程级的全局对象,被子解释器所共享。因此,它们无法并行运行。http://objectmix.com/python/377035-multiple-independent-python-interpreters-c-c-program.html - codeape
5
GIL只在执行实际的Python代码时才会发挥作用。因此,如果您使用的是能够在不持有GIL的情况下执行工作的C扩展模块,那么仍然可以获得某种程度的并发性。一些C扩展模块会有意地分区其数据,以便能够这样做,并从多个CPU/核心系统中获益。 - Graham Dumpleton
@GrahamDumpleton,我想如果模块无意中共享状态,那也可能会造成麻烦吧? - Prof. Falken
1
@AmigableClarkKant 确实发生了这个问题。从记忆中可以看出,psycopg2 一度存在问题,因为没有正确地对不同的子解释器进行数据分区。因此,一次只能在一个子解释器中使用。 - Graham Dumpleton
这些数据库操作中有哪些是不安全的?使用fastcgi更好吗? - johnny
显示剩余3条评论

0
据我上次了解,这个想法是为了能够在同一个进程中执行多个应用程序以及同一个应用程序的多个副本。这是其他脚本语言(例如TCL)中的一个特性,对GUI构建器、Web服务器等非常有用。
在Python中,这个特性会出现问题,因为许多扩展不支持多解释器安全,因此一个解释器的操作可能会影响另一个解释器中的变量。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接