总起:由于python中只有一个线程能拿到GIL(全局锁),因此python的多线程其实是一种伪的多线程。略去其他说明,总而言之,在python中,我们使用多进程来解决计算密集型的问题,而使用多线程解决IO密集型的问题。
使用两个队列,一个队列保存需要访问的url,将爬到的文本放入另一个结果队列中即可。主要是学习了一下守护进程和join方法,守护进程如果设为true的话,那么当主线程结束的时候,子线程也会强制结束;而join方法则相反,只有当子线程结束之后,主线程才能停止。(主线程和子线程同时开始运作)
这里留一个坑,我并没有弄明白如何让cpu的效率最大化(也就是要开几个爬线程,开几个写的线程,怎么分配资源。。。)
from threading import Thread
import queue
import time
class threadCrawl(Thread):
def __init__(self,url_queue, html_queue):
Thread.__init__(self)
self.url_queue = url_queue
self.html_queue = html_queue
def run(self):
while True:
url = self.url_queue.get()
time.sleep(3)
print("connecting "+ str(url))
self.html_queue.put(url+100)
self.url_queue.task_done()
if self.url_queue.empty():
break
class threadWrite(Thread):
def __init__(self,html_queue):
Thread.__init__(self)
self.html_queue = html_queue
def run(self):
while True:
item = self.html_queue.get()
self.html_queue.task_done()
print("writing "+ str(item))
def main():
url_queue = queue.Queue()
html_queue = queue.Queue()
#开10个访问网络的进程
for i in range(10):
url_queue.put(i)
#开10个写的进程
for i in range(10):
p = threadCrawl(url_queue,html_queue)
p.setDaemon(True)
p.start()
p2= threadWrite(html_queue)
p2.setDaemon(True)
p2.start()
url_queue.join()
html_queue.join()
main()