最近打算写一个爬虫去爬取招聘网站的招聘信息,在经过一周的Python基本学习后,初步打算使用Python进行爬虫的开发。在初步接触后,本打算使用分布式结构进行爬取作业,但是却在测试过程中,发现一些问题。先贴上我写的测试用例
首先参照了官方文档的例子
Master.py
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from multiprocessing.managers import BaseManager
import queue
queue = queue.Queue()
class QueueManager(BaseManager):
pass
QueueManager.register('get_queue',callable=lambda : queue)
m = QueueManager(address=('127.0.0.1',50000),authkey=b'abracadabra')
s = m.get_server()
s.serve_forever()
Worker_1.py
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from multiprocessing.managers import BaseManager
import queue
class QueueManager(BaseManager):
pass
QueueManager.register('get_queue')
m = QueueManager(address=('127.0.0.1',50000),authkey=b'abracadabra')
m.connect()
queues = m.get_queue()
queues.put('测试')
Worker_2.py
from multiprocessing.managers import BaseManager
import queue
class QueueManager(BaseManager):
pass
QueueManager.register('get_queue')
m = QueueManager(address=('127.0.0.1',50000),authkey=b'abracadabra')
m.connect()
queue = m.get_queue()
print(queue.get())
最后的结果是在Worker_2.py中可以打印出,Worker_1.py的 “测试” 字符串。
但是这种写法有个明显的问题,在主节点Master.py 中,是阻塞式也就是说运行了 s.serve_forever()
之后,该脚本中的其它程序也就无法正常执行。我理解,该类可以看做一个连接不同进程之间的桥梁。虽然Master.py 中也可以通过以下方法传递值:
from multiprocessing import Process, Queue
from multiprocessing.managers import BaseManager
import queue
class Worker(Process):
def __init__(self, q):
self.q = q
super(Worker, self).__init__()
def run(self):
self.q.put('local hello')
if __name__ == '__main__':
queues = Queue()
w = Worker(queues)
w.start()
myQ = queue.Queue()
class QueueManager(BaseManager): pass
QueueManager.register('get_queue', callable=lambda: queues)
QueueManager.register('get_myQ', callable=lambda: myQ)
m = QueueManager(address=('127.0.0.1', 50000), authkey=b'abracadabra')
s = m.get_server()
s.serve_forever()
但是这样操作,依然不能解决我需要在Master.py进行一些分发操作的需求
所以我只能暂缓使用该种方式,以期待通过后面学习或者博友们提供好方法。
附上一个错误解决方法:
这是因为在子进程中又创建了进程引起,解决方法为在if name==’main’主进程进行创建进程操作