"""
模拟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调度循环的更多相关文章

  1. 非main goroutine的退出及调度循环(15)

    本文是<Go语言调度器源代码情景分析>系列的第15篇,也是第二章的第5小节. 上一节我们说过main goroutine退出时会直接执行exit系统调用退出整个进程,而非main goro ...

  2. Golang源码学习:调度逻辑(三)工作线程的执行流程与调度循环

    本文内容主要分为三部分: main goroutine 的调度运行 非 main goroutine 的退出流程 工作线程的执行流程与调度循环. main goroutine 的调度运行 runtim ...

  3. 详解Go语言调度循环源码实现

    转载请声明出处哦~,本篇文章发布于luozhiyun的博客: https://www.luozhiyun.com/archives/448 本文使用的go的源码15.7 概述 提到"调度&q ...

  4. python---twisted的使用,使用其模拟Scrapy

    twisted的网络使用 twisted的异步使用 一:简单使用 from twisted.internet import defer from twisted.web.client import g ...

  5. scrapy 基础组件专题(七):scrapy 调度器、调度器中间件、自定义调度器

    一.调度器 配置 SCHEDULER = 'scrapy.core.scheduler.Scheduler' #表示scrapy包下core文件夹scheduler文件Scheduler类# 可以通过 ...

  6. hdu1047(模拟大量的循环添加)

    标题信息:总结多个大整数,(使用add循环相加的功能) http://acm.hdu.edu.cn/showproblem.php? pid=1047 AC代码: /**  *大数的循环加法,转化为字 ...

  7. CodeForces - 1175B Catch Overflow!(栈模拟多重for循环)

    You are given a function ff written in some basic language. The function accepts an integer value, w ...

  8. JS,JQ实现模拟暂停FOR循环,间隔几秒后再继续执行

    <!DOCTYPE html><head><script src="https://apps.bdimg.com/libs/jquery/2.1.4/jquer ...

  9. Servlet+AJAX实现的模拟电梯调度

    需求产生: 大三下学期天天在学校的同一栋教学楼上课,每天要等四次电梯,有次等电梯无聊了,就想到电梯的运行逻辑该如何用程序来表达呢? 问题描述: 大学的那栋楼有21层,不过在页面中画21层有点密,所以只 ...

随机推荐

  1. Java - Java 命令行简介: 选项, 属性, 参数

    概述 简单介绍一下 java 命令行相关的参数及属性 1. java 命令行 基本 命令 > java <mainClass> 描述 执行 Java 类 需要准备好编译完成的 mai ...

  2. ElementUI+Vue在使用el-dialog时,如何做到在弹出dialog时,外部呈锁定状态,而不是点击外部导致dialog直接关闭。

    ElementUI+Vue在使用el-dialog时,如何做到在弹出dialog时,外部呈锁定状态,而不是点击外部导致dialog直接关闭. 问题描述 今天,在做Element+Vue项目时发现:Di ...

  3. Hadoop 启动/停止集群和节点的命令

    集群启动/停止Hadoop集群:start-all.sh    stop-all.sh 1) 启动NameNode, DataNode 2) 启动JournalNode, JournalNode在hd ...

  4. 计算机二级-C语言-程序填空题-190107记录

    //给定程序的功能是:调用fun函数建立班级通讯录.通讯中记录每位学生的编号,姓名和电话号码.班级的人数和学生的信息从键盘读入,每个人的信息作为一个数据块(代表要使用结构体)写到名为myfile5.d ...

  5. 唠唠C++二级指针、二维数组、指针数组、数组指针等的区分

    今天看c++primer第六章,有这部分的内容,脑子有点糊涂了,看了几篇博客,自己敲了下,记录一下备忘. 二级指针: int **p; 二维数组: int p[10][10]; char q[10][ ...

  6. Angular的启动过程

    我们知道由命令 ng new project-name,cli将会创建一个基础的angular应用,我们是可以直接运行起来一个应用.这归功与cli已经给我们创建好了一个根模块AppModule,而根模 ...

  7. dist-packages vs site-packages

    dist-packages 和 site-packages的区别 Reference: https://stackoverflow.com/questions/9387928/whats-the-di ...

  8. php相关问题学习(以备面试)

    1.原味地址:[ http://www.yiichina.com/tutorial/57 ] 注:本文转自 http://www.icultivator.com/p/5535.html 整理了一份PH ...

  9. VS2013 Solution Explorer can not open

    Delete content under the path: C:\Users\username\AppData\Local\Microsoft\VisualStudio\12.0\Component ...

  10. JupyterLab远程访问配置方法(CentOS7)

    下载 Anaconda3安装包,并执行安装命令: bash Anaconda3-2019.07-Linux-x86_64.sh 确定安装并初始化: Do you wish the installer ...