Rain丶浅笑 发表于 2020-3-1 00:50

python协作式运行没有效果

按照模板嵌套多进程,结果发现速度并没有显著提升!
是我哪里写错了,还是这个多进程只支持爬虫呢?#! /usr/bin/env python3
#coding:utf-8
from gevent import monkey
#从gevent库里导入monkey模块。
monkey.patch_all()
#monkey.patch_all()能把程序变成协作式运行,就是可以帮助程序实现异步。
import gevent,time
#导入gevent、time、requests
from gevent.queue import Queue
#从gevent库里导入queue模块
start = time.time()
import re

keywords_filename = u'过滤词库.txt'

input_filename = u'待过滤.txt'

output_filename = u'过滤完成关键词.txt'


def to_be_filtered(word,keywords):
    '''
    is_filtered是否需要过滤掉,默认为不过滤
    '''
    is_filtered = False
    for keyword in keywords:
      if re.findall('^\s*$',keyword):
            continue
      if word.find(keyword)!=-1:
            '''
            如果标题中发现含有keyword,则过滤掉,并break.
            '''
            is_filtered = True
            break
    return is_filtered,keyword

def is_this_english(word):
    '''
    如果一个word中只包含
    '''
    if re.findall('{2,}',word,re.I):
      return True
    else:
      return False

def crawler():
    while not work.empty():
      word = work.get_nowait()
      '''
      查询要过滤的关键词是否在关键词列表中,如果不在关键词列表中,则添加到输出文件中。
      '''
      b,k = to_be_filtered(word,keywords)
      if not is_this_english(word):
            '''
            如果这是一个英文字则不加入其中。
            '''
            if (not b):
                '''
                使用关键词进行过滤,如果不包含关键词,则加入结果中...
                '''
                keywords_filtered.append(word)
            else:
                print(word,'=> 在关键词中,因此过滤掉,关键词为:',k)
      else:
            print(word,'=> 不在关键词中,因为是英文单词')


if __name__=='__main__':
    #将过滤词库读取到keywords中。
    f = open(keywords_filename,'r',encoding='utf-8')
    keywords =
    f.close()

    print('关键词个数:',len(keywords))

    #读取待过滤的词库
    f = open(input_filename,'r',encoding='utf-8')
    words_to_filter =
    f.close()
    print('待过滤的标题个数:',len(words_to_filter))
    print('请耐心等待....')
    work = Queue()
    #创建队列对象,并赋值给work。
    for url in words_to_filter:
    #遍历url_list
      work.put_nowait(url)
    keywords_filtered = []

    tasks_list= [ ]
    #创建空的任务列表
    for x in range(100):
    #相当于创建了100个任务
      task = gevent.spawn(crawler)
      #用gevent.spawn()函数创建执行crawler()函数的任务。
      tasks_list.append(task)
      #往任务列表添加任务。
    gevent.joinall(tasks_list)
    #用gevent.joinall方法,执行任务列表里的所有任务。




    #输出到目标文件中...
    print('输出标题个数:',len(keywords_filtered))
    output_text = '\n'.join(keywords_filtered)
    f = open(output_filename,'w',encoding='utf-8')
    f.write(output_text)
    f.close()
    end = time.time()
    print(end-start)
    print('程序运行结束...')

Hatsune_miku 发表于 2020-3-1 01:01

小白建议使用多线程模块,threading

nstar1221 发表于 2020-3-1 09:55

不了解这个模块,不过根据我的经验,多线程提升不明显的话,应该是那个地方发生了阻塞,可以试试协程

Rain丶浅笑 发表于 2020-3-1 20:56

nstar1221 发表于 2020-3-1 09:55
不了解这个模块,不过根据我的经验,多线程提升不明显的话,应该是那个地方发生了阻塞,可以试试协程

好的谢谢!
页: [1]
查看完整版本: python协作式运行没有效果