2014-02-23 115 views
1

我有線程限制的問題。我想用QThread來做。所以SpiderThread是QThread對象爬行的一些url。但我想一次限制工作線程到X線程。我之前使用threadpool和QRunnable完成了它,但是當網址數量很大時,它的缺點是很大。所以我有這個簡單的代碼:Python PyQT/PySide QThread限制

self.threads = [] 
    for url in self.urls: 
     th = SpiderThread(url) 
     th.updateresultsSignal.connect(self.update_results) 
     self.threads.append(th) 
     th.start() 

任何人都有使用QThread限制線程的工作示例?

回答

2

所以你想在任何給定的時間至多有X個線程運行?因此,如何通過10個線程共享的URL隊列:

self.threads = [] 
queueu = Queue(self.urls) # replace with a sync queue 
for i in xrange(1,10): 
    th = SpiderThread(queue) 
    th.updateresultsSignal.connect(self.update_results) 
    self.threads.append(th) 
    th.start() 

然後在每個線程的運行,該線程獲得一個URL從隊列中(所以從隊列中刪除),並且當它處理完URL ,它會得到一個新的。在僞代碼

class SpiderThread(Thread): 
    def __init__(self, queue): 
     self.queue = queue 
    def run(self): 
     while not self.queue.empty(): 
      maxWait = 100 # miliseconds 
      try: 
       url = self.queue.get(true, maxWait) 
       process(url) 
      except Queue.Empty: 
       break # no more URLs, work completed! 
+0

對不起,這個例子對我來說太髒了。 你的意思是添加所有的URL到隊列,然後url = queue.get()(不是彈出)或者你的意思是使用list然後彈出。 我認爲這將會處理10次 - 每個線程一次,而不是一次10個線程。 – Nuncjo

+0

Ok nvm,我管理這項工作。我會測試一段時間謝謝。 – Nuncjo

+0

您必須從隊列中彈出每個url,否則其他線程將處理相同的URL。我已經清理了一些適當的方法名稱等例子。 – Schollii