队列对象在不同模块中的线程和对象之间共享

时间:2018-03-08 17:12:40

标签: python multithreading concurrency queue priority-queue

我正在尝试构建一个系统,该系统将持续爬行远程服务器并在本地下载新文件。我希望将爬网和下载拆分为单独的对象和单独的线程。要跟踪服务器上找到的文件以及仍需要下载的文件,我将使用PriorityQueue。

因为稍后系统会更大,添加更多任务,我需要一个位于顶部的主模块,我需要在主模块中启动PriorityQueue。但是我对如何在主模块和爬虫之间共享此PriorityQue有一个问题。

以下是下面的代码,暂时忽略了下载部分,因为它还没有解决问题,因为我无法弄清楚如何制作Crawler对象"请参阅&#34 ;在main.py中创建的队列对象。

main.py

import crawler
import threading
from queue import PriorityQueue
class Watchdog(object):
    def __init__(self):
        self.queue = PriorityQueue

    def setup(self):
        self.crawler    = crawler.Crawler()

    def run(self):
        t1 = threading.Thread(target=self.crawler.crawl(), args=(<pysftp connection>,))
        t1.daemon=True
        t2.daemon=True
        t1.start()
        t2.start()
        t1.join()
        t2.join()

crawler.py

import pysftp
class Crawler(object):
    def __init__(self, connection):
        self.connection = connection

    def crawl(self):
        callbacks = pysftp.WTCallbacks()
        self.connection.walktree(rootdir, fcallback=callbacks.file_cb, dcallback=callbacks.dir_cb, ucallback=callbacks.unk_cb)
        for fpath in callbacks.flist:
            with queue.mutex:
                if not fpath in queue.queue:
                    queue.put(os.path.getmtime(fpath), fpath)

问题在于我无法弄清楚如何使我在main.py中创建的队列对象可以在crawler.py中访问和共享。当我添加下载任务时,它也应该能够看到队列对象,并且我需要在所有模块上同步队列,这样当爬虫添加新文件时,下载器会立即看到。

1 个答案:

答案 0 :(得分:0)

您需要使用多处理模块。查看https://docs.python.org/3.6/library/multiprocessing.html#exchanging-objects-between-processes

上的文档

您也可以使用celery