龙卷风多进程崩溃与 nltk

tornado multi process crash with nltk

我在 Tornado 应用程序中遇到了一些非常奇怪的行为。 我是 运行 很多进程,每个进程都有自己的 HTTP 服务器,并且 运行 在不同的端口上。

我向系统添加了一个新进程,它是另一个 TCPServer class,它侦听完全不同的端口并且不与其他进程进行任何交互。

我按如下方式启动新服务器:

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

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

谢谢

该崩溃消息的关键部分是 "multi-threaded process forked"。如果您打算同时使用线程和进程,则必须在创建任何线程之前分叉所有进程。看起来 nltk 在您导入时正在创建一些线程。如果你也在使用多进程(从你引用的代码看不像,但那显然是不完整的),你必须在所有进程都启动后才导入nltk