twisted 模拟scrapy调度循环
"""
模拟scrapy调度循环
"""
from ori_test import pr_type
import logging
import time
from twisted.internet import defer, task, reactor
from scrapy.utils.reactor import CallLaterOnce
log = logging.getLogger(__name__)
logger_m = log
class Slot(object):
def __init__(self, start_requests, nextcall):
        self.start_requests = iter(start_requests)
        self.nextcall = nextcall
        self.heartbeat = task.LoopingCall(nextcall.schedule)
class Engine():
    @defer.inlineCallbacks
    def open_spider(self, spider, start_requests):
        nextcall = CallLaterOnce(self._next_request, spider)
        #start_requests = yield self.scraper.spidermw.process_start_requests(start_requests, spider)
        slot = Slot(start_requests, nextcall)
        self.slot = slot
        self.spider = spider
        yield 8
        slot.nextcall.schedule()
        slot.heartbeat.start(5)
def _next_request(self, spider):
        print('next_request')
        slot = self.slot
        if not slot:
            return
        try:
            v = next(slot.start_requests)
        except StopIteration:
            slot.start_requests = None
except Exception:
            slot.start_requests = None
        else:
            def task_print(k):
                #k = next(slot.start_requests)
                d = defer.Deferred()
                reactor.callLater(0, d.callback, k)
                return d
            d = task_print(v)
            d.addCallback(lambda x: print('d is done', x))
            d.addErrback(lambda x: print('d is not done'))
            d.addCallback(self._next_request)
            d.addErrback(lambda x: print('d is error'))
class Spider():
    def __init__(self):
        pass
        self._before_start()
def start_requests(self):
        logger_m.info('start spider the first page!')
        # USER_AGENT = 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'
for x in range(1000):
            #time.sleep(3)
            print('from spider yield', x )
            yield x
#print(x)
        # req = scrapy.Request(url='https://httpbin.org/ip', dont_filter=True)
        yield 8888
def _before_start(self):
        # 注册爬虫,信息内容为{spider_id, time()}
        def spider_alive():
            print('from looptask:spider alive')
            # print(res)
            pass
# 添加到定时任务,定时声明爬虫生死
        # twisted 任务
        looptask = task.LoopingCall(spider_alive)
        looptask.start(5, now=True)
        #looptask.start(60, now=True)
spider = Spider()
s_r = spider.start_requests()
pr_type(s_r)
s_r = iter(s_r)
pr_type(s_r)
a = Engine()
a.open_spider(spider, s_r)
reactor.run()
twisted 模拟scrapy调度循环的更多相关文章
- 非main goroutine的退出及调度循环(15)
		本文是<Go语言调度器源代码情景分析>系列的第15篇,也是第二章的第5小节. 上一节我们说过main goroutine退出时会直接执行exit系统调用退出整个进程,而非main goro ... 
- Golang源码学习:调度逻辑(三)工作线程的执行流程与调度循环
		本文内容主要分为三部分: main goroutine 的调度运行 非 main goroutine 的退出流程 工作线程的执行流程与调度循环. main goroutine 的调度运行 runtim ... 
- 详解Go语言调度循环源码实现
		转载请声明出处哦~,本篇文章发布于luozhiyun的博客: https://www.luozhiyun.com/archives/448 本文使用的go的源码15.7 概述 提到"调度&q ... 
- python---twisted的使用,使用其模拟Scrapy
		twisted的网络使用 twisted的异步使用 一:简单使用 from twisted.internet import defer from twisted.web.client import g ... 
- scrapy 基础组件专题(七):scrapy 调度器、调度器中间件、自定义调度器
		一.调度器 配置 SCHEDULER = 'scrapy.core.scheduler.Scheduler' #表示scrapy包下core文件夹scheduler文件Scheduler类# 可以通过 ... 
- hdu1047(模拟大量的循环添加)
		标题信息:总结多个大整数,(使用add循环相加的功能) http://acm.hdu.edu.cn/showproblem.php? pid=1047 AC代码: /** *大数的循环加法,转化为字 ... 
- CodeForces - 1175B Catch Overflow!(栈模拟多重for循环)
		You are given a function ff written in some basic language. The function accepts an integer value, w ... 
- JS,JQ实现模拟暂停FOR循环,间隔几秒后再继续执行
		<!DOCTYPE html><head><script src="https://apps.bdimg.com/libs/jquery/2.1.4/jquer ... 
- Servlet+AJAX实现的模拟电梯调度
		需求产生: 大三下学期天天在学校的同一栋教学楼上课,每天要等四次电梯,有次等电梯无聊了,就想到电梯的运行逻辑该如何用程序来表达呢? 问题描述: 大学的那栋楼有21层,不过在页面中画21层有点密,所以只 ... 
随机推荐
- 微信小程序UDP通信
			前言 UDP通信分为单播 广播 组播,基础库2.7.0之后,小程序开始支持UDP通信,目前小程序只支持单播. 小程序API 小程序UDP通信这一块可以说是很简单了就一个UDPSocket实例.然后bi ... 
- Codeforces Round #613 (Div. 2)D(贪心,分治)
			构造两颗深度为30的字典树(根节点分别是0和1),结点只有0和1,从根节点向下DFS,贪心取答案. #define HAVE_STRUCT_TIMESPEC #include<bits/stdc ... 
- RedHat7 / CentOS 7 忘记root密码修改
			摘自:https://blog.csdn.net/bubbleyang/article/details/91360856 进入互动式命令环境 开机出现 grub boot loader 开机选项菜单时 ... 
- C语言当中int,float,double,char这四个有什么区别?
			区别在以下方面: 一.定义方面: 1.int为整数型,用于定义整数类型的数据 . 2.float为单精度浮点型,能准确到小数点后六位 . 3.double为双精度浮点型,能准确到小数点都十二位 . 4 ... 
- yii2的防御csrf攻击机制
			csrf,中文名称:跨站请求伪造,可以在百度上搜索资料,详细了解这一方面的概念.对于我们是非常有帮助的.yii2的csrf的实现功能是在yii\web\request类实现功能的.request类中的 ... 
- Django 生成数据库表时的报错TypeError: __init__() missing 1 required positional argument: 'on_delete'
			原因及解决办法: https://www.cnblogs.com/phyger/p/8035253.html 
- nginx反向代理配置及常见指令
			nginx配置文件: /usr/local/nginx1.16.1/conf/nginx.conf nginx.conf默认的server配置: server{ listen 80; server_n ... 
- WEB - 关于rel="noopener"
			参考网址 https://mathiasbynens.github.io/rel-noopener/ 例子 <a href="https://cli.vuejs.org" t ... 
- qq音乐解析API
			文档:www.tjit.net 开放的接口:api88.net 个人代码: input2(event){ //将字符转化为encodeURL编码,才能进行正确请求,这是这个接口要求的 //js自带的转 ... 
- 【Struts  分派Action】DispatchAction
			LoginAction package k.action; import k.form.UserForm; import org.apache.struts.action.ActionForm; im ... 
