Python/PySide/PyQt中的多线程Web抓取

Bo *_*ich 2 python multithreading pyqt pyside

我正在建立一种网络刮板.基本上,软件的作用是:

  1. 用户(我)输入一些数据(ID) - ID很复杂,所以不仅仅是数字
  2. 根据这些ID,脚本访问http:// localhost/ID

完成此任务的最佳方法是什么?所以我正在寻找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?

在此先感谢您的回答!

And*_*son 5

正如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)