2016-09-10 3 views
2

スレッドを使用して5つのWebサイトを同時にクロールする基本クローラを開発中です。 サイトごとに新しいスレッドが作成されます。シェルからプログラムを実行すると、出力ログには5つのスレッドがすべて期待どおりに実行されることが示されます。 しかし、このプログラムをsupervisordプログラムとして実行すると、ログには毎回2つのスレッドしか実行されていないことが表示されます。ログは、5つのスレッドがすべて開始されたが、そのうちの2つだけが実行されており、残りがスタックされていることを示します。 シェルから実行したときとスーパーバイザから実行したときに、この不一致がなぜ起こっているのか理解できません。私が考慮していないものはありますか?スーパーバイザでスレッドが実行されていない

for sid in entries: 
    url = entries[sid] 
    threading.Thread(target=self.crawl_loop, \ 
        args=(sid, url)).start() 

UPDATES:ここ

がスレッドを作成するコードであるコメントでtdelaneyによって示唆されるように が、私はsupervisord構成で作業ディレクトリを変更し、現在すべてのスレッドが実行されています予想通り。クローラファイルディレクトリに作業ディレクトリを設定すると、問題が修正される理由はまだ分かりませんが、おそらく、監督者がプロセスを管理する方法を知っている人が説明できるでしょうか?

+0

エントリはどこから来たのですか、ログはどこに行きますか? supervisordを使用しているときに、異なるユーザー名と現在の作業ディレクトリがあり、潜在的に考えているファイルとは異なるファイルを使用している可能性があります。 – tdelaney

答えて

1

AFAIKのpythonスレッドは、スレッドセーフではないため、スレッドを正しく実行できません。これは、コードの同時実行をシミュレートする機能を提供します。あなたのコードは1コアだけを使用します。

https://wiki.python.org/moin/GlobalInterpreterLock

https://en.wikibooks.org/wiki/Python_Programming/Threading

したがって、より多くのプロセス/スレッドを生成しないことも可能です。

私はマルチプロセッシングを使うべきでしょうか?

https://docs.python.org/2/library/multiprocessing.html

+0

私はマルチプロセッシングを使って試しました。同じ結果。それでも、すべてのスレッドが 'python crawler.py'としてシェルから実行される理由を理解できませんが、スーパーバイザでジョブとして追加するときは、同じ2つのスレッドのみが常に実行されます。 – conquester

+0

実行しているスレッドの数を正確に記録する方法を教えてください。言い換えれば、実行中のスレッドの数はどのように決定されますか? –

+0

スレッドはあらかじめ決められています。 5つのウェブサイトの5つのスレッド。また、私は新しい開発を反映するために質問を更新しました。 – conquester

0

Iは同じサイレント問題を有するが、その後Iスーパーバイザ問題を引き起こした、trueにデーモンを設定したことに気づきました。

https://docs.python.org/2/library/threading.html#threading.Thread.daemon

監督の下で実行しているときにそう答えは、デーモン=真のスクリプトを自分で実行し、偽です。

0

私はちょうど非常に似た問題を経験していました。

私の場合は、シリアルデバイス(Arduino nano on/dev/ttyUSB0)のリスンに専用のスレッドを使用して、低消費電力のマシン(RaspberryPi)で作業していました。コードはコマンドラインで完全に機能しましたが、シリアル読み取りスレッドはスーパーバイザの下で停止しました。

ちょっとハッキングして(ここではすべてのオプションを試してみた)、私はバッファリングされていないモードでPythonを実行しようとしましたが、問題を解決できました!私はhttps://stackoverflow.com/a/17961520/741316からアイデアを得ました。

本質的に、私は単に-uフラグを持つpythonを呼び出しました。

関連する問題