【问题标题】:tornado multi process crash with nltk龙卷风多进程崩溃与 nltk
【发布时间】:2017-02-24 07:57:42
【问题描述】:

我在龙卷风应用程序中遇到了一些非常奇怪的行为。 我正在运行很多进程,每个进程都有自己的 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

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

谢谢

【问题讨论】:

    标签: python crash tornado


    【解决方案1】:

    该崩溃消息的关键部分是“多线程进程分叉”。如果要同时使用线程和进程,则必须在创建任何线程之前分叉所有进程。看起来nltk 在您导入它时正在创建一些线程。如果您还使用多个进程(看起来您不是来自您引用的代码,但这显然是不完整的),在所有进程启动之前,您不得导入nltk

    【讨论】:

    • 嗨,Ben 我已经添加了如何创建所有流程。 runServer 函数启动 HTTP 应用程序服务器。这些还有一些其他用于 IPC 的 TCP 服务器。 runSimServer 是独立的,但这是导入 nltk 并导致崩溃的进程。那么你是说我需要在 simServer 中导入 nltk 之前启动所有其他进程吗? simServer 中的线程不是独立的吗?为什么它们会影响其他进程?
    • 请发布一个 completerunnable 示例,包括所有导入。从runSimServer 中导入nltk (因此在不会再次分叉的子进程中)应该没问题,但这似乎不是您根据上面引用的runSimService 方法所做的事情。
    • 感谢 Ben,虽然我很想知道发生了什么,但我实际上已经从 nltk 转移到 spacy 进行语言处理,并且问题停止了。不幸的是,无论如何发布一个完整的可运行示例将是困难的。实际上我犯了一个错误,进程创建中的runSimServer应该是runSimService ..无论哪种方式,它现在都在工作。感谢您指出我需要在创建任何线程之前创建所有进程。这对未来有好处。干杯
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-27
    • 1970-01-01
    相关资源
    最近更新 更多