我在龙卷风应用程序中遇到了一些非常奇怪的行为。 我运行了很多进程,每个进程都有自己的HTTP服务器并在不同的端口上运行。
我在系统中添加了一个新进程,这是另一个TCPServer类,它监听一个完全不同的端口,并且没有与其他进程进行任何交互。
我按照以下方式启动新服务器:
def runSimService(port):
sim=SimService()
sim.listen(port)
currentIOLoop = tornado.ioloop.IOLoop.current()
currentIOLoop.start()
class SimService(TCPServer):
def __init__(self,host='localhost',motorport=27017):
TCPServer.__init__(self)
self.log=logging.getLogger("tornado.access")
# Needs to contain a User class log.
self.con=motor.MotorClient(host,motorport)
self.db=self.con.pDB
self.col=self.db.pCol
基本上这是我调试时留下的唯一代码。我遇到的崩溃不是正常的python异常崩溃,令我担心。
我现在正在Mac上发展。有人可以解释一下这个崩溃是我的代码有问题还是在这里发生了其他事情?'
好的,这真的很奇怪,只有当我导入以下内容时才会发生:
from nltk.stem.snowball import SnowballStemmer
OR
from nltk import word_tokenize, pos_tag
或nltk一般......
图书馆之间是否会发生一些奇怪的互动?我被困了
if __name__ =='__main__':
AsyncHTTPClient.configure("tornado.curl_httpclient.CurlAsyncHTTPClient",max_clients=2000)
processes=[]
processes.append(Process(target=runSimServer,args=(...,)))
processes.append(Process(target=runServer,args=(...)))
processes.append(Process(target=runServer,args=(...)))
processes.append(Process(target=runServer,args=(...)))
processes.append(Process(target=runServer,args=(...)))
processes.append(Process(target=runServer,args=(...)))
# write pids to pid/ directory for use with the shutdown program
with open("pid/"+__file__.split(".")[0]+".pid","w") as f:
for p in processes:
p.start()
f.write(str(p.pid)+"\n")
由于
答案 0 :(得分:1)
该崩溃消息的关键部分是“多线程进程分叉”。如果要同时使用线程和进程,则必须在创建任何线程之前分叉所有进程。看起来nltk
在导入时会创建一些线程。如果您还使用多个进程(它看起来不像您引用的代码,但显然不完整),则必须在所有进程启动之后才导入nltk
。