Size: 989
Comment:
|
Size: 3437
Comment: 删除对PageComment2组件的引用
|
Deletions are marked like this. | Additions are marked like this. |
Line 13: | Line 13: |
== 问题 == {{{ 老光 <[email protected]> reply-to [email protected] to eurasia-users <[email protected]> date Tue, Dec 16, 2008 at 10:12 subject [eurasia-users] 这个my_import是否是线程安全的?在E3中使用会出问题么? }}} 好象是木头老大的网页上抄来改的. 来自:[Python学习][http://blog.donews.com/limodou/archive/2005/06/10/422024.aspx __import__与reload要注意的 - limodou的学习记录] - DonewsBlog {{{#!python import os,sys,time def my_import( name ): """自定义的WINDOWS环境的导入函数,通过把路径增加到sys.path中去来导入任意路径的文件, 但不能改变只能导入一个同名文件的问题 """ if name[1] <> ':' and name[0]<>'/': # 如果第二个字符是盘符,或是以'/'开头,则证明是绝对路径,不需要增加相对路径. name = os.sep.join( [os.getcwd(),name] ) basedir = os.path.dirname(name) basename = os.path.basename(name) if basename.split('.')>1: # 含有扩展名,则删去. basename = basename.split('.')[0] if basename=='': # 如果模块名为空,则导入__init__.py文件 basename = '__init__' if sys.modules.has_key(basename): # 如果已导入了同名模块,要先删去 del sys.modules[basename] sys.path.insert( 0, basedir ) result = __import__( basename ) del sys.path[0] return result }}} 现在想在Karrigell3.0中和Eurasia中使用这个模块,来根据绝对路径导入py文件. 以前在Karrigell2.X中使用正常的 就是,末三行能不能保证是一个原子操作,不会被打断?否则有可能得到不正确的result. == 对策 == {{{ 沈崴 <[email protected]> reply-to [email protected] to eurasia-users <[email protected]> date Tue, Dec 16, 2008 at 13:00 subject [eurasia-users] Re: 这个my_import是否是线程安全 }}} Eurasia 是单线程程序 (你可以认为在 Eurasia 中的 controller 线程都是模拟出来的), * 如果中间没有 request 的 read/write 操作以及 stackless 的 schedule/channel 调用, * 当前任务不会中断, 所有连续的代码都是连续顺序执行的。所以上面整个程序都是一个原子操作。 如果你需要从绝对路径导入一个 python 模块, 可以使用 eurasia.pyetc 模块。 {{{ from eurasia import pyetc mod = pyetc.load('/PATH/foo.py') }}} 具体详见文档中 "配置文件支持" 一节。 |
|
Line 36: | Line 101: |
||<^>[[PageComment2]]||<^>[:/PageCommentData:PageCommentData]''|| |
线程安全的模块导入
问题
老光 <[email protected]> reply-to [email protected] to eurasia-users <[email protected]> date Tue, Dec 16, 2008 at 10:12 subject [eurasia-users] 这个my_import是否是线程安全的?在E3中使用会出问题么?
好象是木头老大的网页上抄来改的.
来自:[Python学习][http://blog.donews.com/limodou/archive/2005/06/10/422024.aspx import与reload要注意的 - limodou的学习记录] - DonewsBlog
1 import os,sys,time
2
3 def my_import( name ):
4 """自定义的WINDOWS环境的导入函数,通过把路径增加到sys.path中去来导入任意路径的文件,
5 但不能改变只能导入一个同名文件的问题
6 """
7
8 if name[1] <> ':' and name[0]<>'/': # 如果第二个字符是盘符,或是以'/'开头,则证明是绝对路径,不需要增加相对路径.
9 name = os.sep.join( [os.getcwd(),name] )
10 basedir = os.path.dirname(name)
11 basename = os.path.basename(name)
12 if basename.split('.')>1: # 含有扩展名,则删去.
13 basename = basename.split('.')[0]
14 if basename=='': # 如果模块名为空,则导入__init__.py文件
15 basename = '__init__'
16
17 if sys.modules.has_key(basename): # 如果已导入了同名模块,要先删去
18 del sys.modules[basename]
19
20 sys.path.insert( 0, basedir )
21 result = __import__( basename )
22 del sys.path[0]
23
24 return result
现在想在Karrigell3.0中和Eurasia中使用这个模块,来根据绝对路径导入py文件. 以前在Karrigell2.X中使用正常的
就是,末三行能不能保证是一个原子操作,不会被打断?否则有可能得到不正确的result.
对策
沈崴 <[email protected]> reply-to [email protected] to eurasia-users <[email protected]> date Tue, Dec 16, 2008 at 13:00 subject [eurasia-users] Re: 这个my_import是否是线程安全
Eurasia 是单线程程序 (你可以认为在 Eurasia 中的 controller 线程都是模拟出来的),
- 如果中间没有 request 的 read/write 操作以及 stackless 的 schedule/channel 调用,
- 当前任务不会中断, 所有连续的代码都是连续顺序执行的。所以上面整个程序都是一个原子操作。
如果你需要从绝对路径导入一个 python 模块, 可以使用 eurasia.pyetc 模块。
from eurasia import pyetc mod = pyetc.load('/PATH/foo.py')
具体详见文档中 "配置文件支持" 一节。
另外导入一个模块不必这么复杂, 这么写就可以了:
这样就不用担心线程问题, 在 Karrigell 中也可以用。
具体可以参考 [http://eurasia.googlecode.com/svn/trunk/src/eurasia/pyetc.py eurasia/pyetc.py] 只有 57 行代码。
反馈
创建 by -- ZoomQuiet [DateTime(2008-12-16T05:39:28Z)]