2012-03-12 16 views
2

私は種類のWebスクレーパーを構築しています。基本的には、どのようなソフトはどうなることは次のとおりです。Python/PySide/PyQtでのマルチスレッドのWebスクラブ

  1. ユーザー(私は)いくつかのデータ(ID)を入力 - IDは複雑で、そうでない数字だけそれらのIDに基づいて
  2. 、スクリプトがhttp://localhost/ID
を訪問します

これを達成する最良の方法は何ですか?だから私はそれを行うために20-30同時接続を上に探しています。

私は考えていた、簡単なループは解決策ですか?このループはQThreads(Qtアプリ)を起動するので、同時に実行されます。

しかし、私はループで見ている問題は、その前に実行されていたイテレーション/スレッドで使用されていないIDだけを使用するように指示する方法ですか?どのようなIDが使用されたのかを追跡し、未使用のものをQThreadsに委任する何らかの「委任者」関数が必要でしょうか?

は今、私はいくつかのコードを書いているが、私はそれが正しいかどうかを確認していない:

class GUI(QObject): 

    def __init__(self): 
     print "GUI CLASS INITIALIZED!!!" 
     self.worker = Worker() 

     for i in xrange(300): 
      QThreadPool().globalInstance().start(self.worker) 

class Worker(QRunnable): 

    def run(self): 
     print "Hello world from thread", QThread.currentThread() 

は今、私はこれらは私が欲しいものを本当に実現するかはわかりません。これは実際に別のスレッドで実行されていますか?私はこれが実行されるたびにcurrentThread()が同じであるので尋ねています。だから、そうは見えません。

基本的に私の質問は、いくつかの同じQThreadを同時にどのように実行するのでしょうか?

お返事ありがとうございます!

+0

ロジックをGUIから分離し、GUIにのみQTを使用してください。クローラロジックは純粋なPythonで書かれているか、[scrapy](http://scrapy.org/)のような既存のクローラを再利用する必要があります。 – Dikei

答えて

5

Dikeiが言っているように、Qtはここで赤いニシンです。 Pythonスレッドを使うだけで、コードをもっと簡単に保つことができます。

以下のコードでは、実行するジョブを含むjob_queueというセットがあります。また、渡されたキューからジョブを取り出して実行する関数worker_threadもあります。ここでは、ランダムな時間だけ眠っています。ここで重要なことは、set.popがスレッドセーフであることです。

スレッドオブジェクトの配列workersを作成し、それぞれを作成するときにstartを呼び出します。 Python documentationから、threading.Thread.startは、別個の制御スレッドで与えられた呼び出し可能オブジェクトを実行します。最後に、各ワーカースレッドを通過し、終了するまでブロックします。

import threading 
import random 
import time 

pool_size = 5 

job_queue = set(range(100)) 

def worker_thread(queue): 
    while True: 
     try: 
      job = queue.pop() 
     except KeyError: 
      break 

     print "Processing %i..." % (job,) 
     time.sleep(random.random()) 

    print "Thread exiting." 

workers = [] 
for thread in range(pool_size): 
    workers.append(threading.Thread(target=worker_thread, args=(job_queue,))) 
    workers[-1].start() 

for worker in workers: 
    worker.join() 

print "All threads exited" 
+1

実際にはそれに依存します。スレッドがGUIと通信する必要がある場合、 'QThread'はより良く、より簡単になります。 – Avaris

+0

@Avarisと同様に、スレッドはGUIスレッドと通信する必要があり、既存のコードは主にQThreadとして記述されているので、Pythonの組み込みスレッドモジュールの代わりにこのコードを使用する必要があります。とにかく、詳細な対応のためにあなたを+1しました。 –

+0

time.sleep(random.random())を使用する利点は何ですか –

関連する問題