Bo *_*ich 2 python multithreading pyqt pyside
我正在建立一种网络刮板.基本上,软件的作用是:
完成此任务的最佳方法是什么?所以我正在寻找20-30个并发连接来实现它.
我在想,一个简单的循环会成为解决方案吗?这个循环将启动QThreads(它是一个Qt应用程序),因此它们将同时运行.
然而,我在循环中看到的问题是如何指示它只使用之前未使用的那些ID,即在之前执行的迭代/线程中?我是否需要某种"委托人"功能,该功能将跟踪已使用的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()
Run Code Online (Sandbox Code Playgroud)
现在我不确定这些是否真正实现了我的目标.这实际上是在单独的线程中运行吗?我问,因为currentThread()每次执行都是一样的,所以看起来并不那样.
基本上,我的问题归结为如何同时执行几个相同的QThreads?
在此先感谢您的回答!
正如Dikei所说,Qt在这里是红鲱鱼.专注于使用Python线程,因为它将使您的代码更简单.
在下面的代码中,我们有一个set job_queue,包含要执行的作业.我们还有一个函数,worker_thread它从传入的队列中获取作业并执行.在这里它只是随机休息一段时间.这里的关键set.pop是线程安全.
我们创建一个线程对象数组workers,并start在创建它们时调用每个对象.从Python文档中, threading.Thread.start在一个单独的控制线程中运行给定的callable.最后,我们遍历每个工作线程并阻塞,直到它退出.
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"
Run Code Online (Sandbox Code Playgroud)