Python 请求的Twisted\u delayedRender内的多线程调用
我有一个简单的Twisted Web服务器应用程序来满足我的数学要求。一切正常(我隐藏了与我的问题无关的大代码块): 当我试图通过将Python 请求的Twisted\u delayedRender内的多线程调用,python,multithreading,twisted,scikit-learn,Python,Multithreading,Twisted,Scikit Learn,我有一个简单的Twisted Web服务器应用程序来满足我的数学要求。一切正常(我隐藏了与我的问题无关的大代码块): 当我试图通过将n_作业例如设置为3来加速cross_验证计算时 crossval_scores = cross_validation.cross_val_score(pls1, X, y=numpy.asarray(Y), scoring=my_custom_scorer, cv=KFold(700, n_folds=700), n_jobs=3) 在那之后,我得到了3个例外:
n_作业
例如设置为3来加速cross_验证
计算时
crossval_scores = cross_validation.cross_val_score(pls1, X, y=numpy.asarray(Y), scoring=my_custom_scorer, cv=KFold(700, n_folds=700), n_jobs=3)
在那之后,我得到了3个例外:
twisted.internet.error.CannotListError:无法侦听任何端口:12000:[Errno 10048]每个套接字地址(协议/网络地址/端口)通常只允许使用一次
由于某些原因,我不能在n_jobs>1 in_delayedRender的情况下调用cross_val_score。
以下是异常的回溯,出于某些原因reactor.listenTCP也尝试启动了3次
有什么办法让它工作吗
UPD1。我创建了PLS.py文件,并将所有代码移到这里,最后两行除外:
from twisted.web import server
from twisted.internet import reactor, threads
import PLS
reactor.listenTCP(12000, server.Site(PLS.PlsPage()))
reactor.run()
但问题依然存在。我还发现这个问题只在Windows上存在。我的Linux机器可以很好地运行这些脚本。scikit\u learn显然使用了
多处理模块来实现并发性。多处理
使用pickle
在进程之间传输数据,其中包括。。。它导致的特殊问题将导致在父进程中导入的某些模块被导入到工作进程中
然而,你的PLS_web.py
“模块”实际上不是一个模块,而是一个脚本;由于您已将reactor.listenTCP
和reactor.run
放在它的底部,因此在导入它时它实际上会做一些事情,而不仅仅是加载它的代码
此特定错误是因为您的web服务器正在运行4次(一次用于控制器进程,一次用于三个作业中的每一个),在第一次之后的3次中的每一次都会遇到错误,因为第一台服务器已经在端口12000上侦听
您应该将reactor.run
/reactor.listenTCP
行删除到顶级脚本中。一个好的经验法则是,这些行不应与类
或def
语句出现在同一个文件中;在一个地方定义代码,然后在另一个地方启动。一旦您将其移动到一个无法导入的文件中(您甚至可能希望将其放入一个名称不是合法模块标识符的文件中,如run my server.py
),那么多处理
就可以导入它所需的所有代码并完成它的工作
更好的是,根本不要写那些行,编写一个,然后用twistd
运行程序。如果不必将reactor.run
语句放在任何位置,就不能将其放在错误的位置:)。scikit\u learn显然使用了多处理
模块来实现并发。多处理
使用pickle
在进程之间传输数据,其中包括。。。它导致的特殊问题将导致在父进程中导入的某些模块被导入到工作进程中
然而,你的PLS_web.py
“模块”实际上不是一个模块,而是一个脚本;由于您已将reactor.listenTCP
和reactor.run
放在它的底部,因此在导入它时它实际上会做一些事情,而不仅仅是加载它的代码
此特定错误是因为您的web服务器正在运行4次(一次用于控制器进程,一次用于三个作业中的每一个),在第一次之后的3次中的每一次都会遇到错误,因为第一台服务器已经在端口12000上侦听
您应该将reactor.run
/reactor.listenTCP
行删除到顶级脚本中。一个好的经验法则是,这些行不应与类
或def
语句出现在同一个文件中;在一个地方定义代码,然后在另一个地方启动。一旦您将其移动到一个无法导入的文件中(您甚至可能希望将其放入一个名称不是合法模块标识符的文件中,如run my server.py
),那么多处理
就可以导入它所需的所有代码并完成它的工作
更好的是,根本不要写那些行,编写一个,然后用twistd
运行程序。如果你不必把reactor.run
语句放在任何地方,你就不能把它放错地方:)。谢谢你的解释。但问题仍然存在,我更新了问题。我还发现只有在Windows中才会出现异常。我的linux服务器可以很好地运行这段代码。在Windows上,当执行多处理时,如果uuu name uuu=='uuuuu main uu'
任何“主”代码都应该由保护。这是一个众所周知的问题;谷歌,谢谢你的解释。但问题仍然存在,我更新了问题。我还发现只有在Windows中才会出现异常。我的linux服务器可以很好地运行这段代码。在Windows上,当执行多处理时,如果uuu name uuu=='uuuuu main uu'
任何“主”代码都应该由保护。这是一个众所周知的问题;谷歌就是这样。
from twisted.web import server
from twisted.internet import reactor, threads
import PLS
reactor.listenTCP(12000, server.Site(PLS.PlsPage()))
reactor.run()