我正在尝试构建一个系统,该系统将持续爬行远程服务器并在本地下载新文件。我希望将爬网和下载拆分为单独的对象和单独的线程。要跟踪服务器上找到的文件以及仍需要下载的文件,我将使用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中访问和共享。当我添加下载任务时,它也应该能够看到队列对象,并且我需要在所有模块上同步队列,这样当爬虫添加新文件时,下载器会立即看到。
答案 0 :(得分:0)
您需要使用多处理模块。查看https://docs.python.org/3.6/library/multiprocessing.html#exchanging-objects-between-processes
上的文档您也可以使用celery