Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 请求的Twisted\u delayedRender内的多线程调用_Python_Multithreading_Twisted_Scikit Learn - Fatal编程技术网

Python 请求的Twisted\u delayedRender内的多线程调用

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个例外:

我有一个简单的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个例外:

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()