【发布时间】:2012-12-19 00:07:23
【问题描述】:
情况如下: 我有一个加载特定 url 的类,还有一个参数列表,我需要发送到这个 url。我想使用线程“同时”加载这个 url,换句话说,不是加载一个 QWebView ,而是完成它而不是加载另一个我想一次打开 5 个窗口的窗口。
好的,所以现在的问题是,每个窗口都有不同的速度,所以我需要跟踪正在使用的参数。
例如:
params = [1,2,3,4,5,6,7]
a = MyClass(1)
b = MyClass(2)
c = MyClass(3)
现在如果假设 b 类在其他 2 个类之前完成,它将获得值 4,然后重新开始。
这是示例代码:
#! /usr/bin/env python2.7
from PyQt4.QtCore import *
from PyQt4.QtGui import *
from PyQt4.QtWebKit import *
import sys, signal
class Grabber(QWebView):
def __init__(self, param=None):
QWebView.__init__(self)
self.loadFinished.connect(self._loadComplete)
url = QUrl('http://some website.com/search?param=%s'%param)
self.load(url)
self.show()
def _loadComplete(self):
print "Done"
if __name__ == "__main__":
app = QApplication(sys.argv)
# Dont know what to do with the next 2 lines
thread_pool = QThreadPool()
thread_pool.setMaxThreadCount(10)
param = [1,2,3,4,5,6,7,8,9,10,11,12] # and so on
# Whant to achive something similar:
for i in param:
a = Grabber(i)
b = Grabber(i)
c = Grabber(i)
d = Grabber(i)
e = Grabber(i)
if signal.signal(signal.SIGINT, signal.SIG_DFL):
sys.exit(app.exec_())
app.exec_()
我很确定我需要使用线程、ether python native 线程或 PyQt4 QThread。
【问题讨论】:
-
不确定它是如何在 Python/PyQt 中实现的,但听起来你所需要的是一个队列结构,你可以调用 pop() 来每次结束时获取下一个值Grabber 完成了它的工作。只需确保将对 pop() 的调用包装在某种线程锁(例如互斥锁)中,以便一次只有一个线程尝试调用 pop。不是真正的答案(因此在评论中),但应该给你一些条款谷歌的解决方案;)
-
谢谢,没想到,但声音很棒
-
@Vor 查看我的答案,我对其进行了编辑以返回
grabber对象
标签: python multithreading qt pyqt threadpool