twitter的Future的简单使用

并发操作与Future在Scala中的应用
本文通过示例展示了如何在Scala中使用Future进行并发操作,包括创建Future、组合Future结果、处理异常以及实现真正的异步并发。通过具体代码演示了Future的使用方法和效果。
直接上示例:
获取一个Futute:
def getFuture3: Future[String] = {
    FuturePool.unboundedPool {
        println("begin future3")
        println(Thread.currentThread().getName)
        TimeUnit.SECONDS.sleep(3)
        println("future3 over.")
        "zero"
    }
}
类似Java,在线程池里提交一个任务,返回值即 { } 中的值。注意这里的线程池是twitter中的UnboundedFuturePool(无界任务池),当然可以指定线程池:
def getFuture2: Future[String] = {
    val executors = Executors.newFixedThreadPool(3)
    val futurePool: ExecutorServiceFuturePool = FuturePool.apply(executors)
    futurePool.apply({
        //使用的是自定义的pool
        println("begin future2")
        println("future2 --- " + Thread.currentThread().getName)
        TimeUnit.SECONDS.sleep(3)
        println("future2 over.")
        "zero"
    })
}
这里指定了executors线程池,那个任务执行由指定池中的线程去完成。如果需要get这个future的值:
val result = Await.result(getFuture3, DEFAULT_TIMEOUT)

组合两个future的结果为另一个future,test2也是同样:
def test1: Unit = {
    val future3 = for (f1 <- getFuture1; f2 <- getFuture2) yield (f1 + " " + f2)
    println("await")
    val result = Await.result(future3, DEFAULT_TIMEOUT)
    println(result)
}
运行结果:
begin future1
await
future1 --- UnboundedFuturePool-1
future1 over.
begin future2
future2 --- pool-1-thread-1
future2 over.
zero zero
从运行结果,效果上看for中内容还是串行执行,但 future3 与 println("await") 是并行执行的,方式二:
def combine(a: String, b: String): Future[String] = {
    FuturePool.unboundedPool {
        println(s"combine $a + $b")
        TimeUnit.SECONDS.sleep(1)
        a + "-" + b
    }
}

def test2: Unit = {
    val result =
        for (
            result1 <- getFuture1;
            result2 <- getFuture2;
            combineResult <- combine(result1, result2)
        ) yield combineResult

    println("await")
    val v = Await.result(result)
    println(v)
}
运行结果:
begin future1
future1 --- UnboundedFuturePool-1
await
future1 over.
begin future2
future2 --- pool-1-thread-1
future2 over.
combine zero + zero
zero-zero
可以看到,使用for来组合两个future的结果时,得是getFuture1完成后getFuture2才开始,是一个串行调用。有其他方式么?

def test3: Unit = {
    val future3 = Future.join(getFuture1, getFuture2)
    val f = future3 flatMap { e =>
        combine(e._1, e._2)
    }
    println("await")
    println(Await.result(f))
}
运行结果:
begin future1
future1 --- UnboundedFuturePool-1
begin future2
future2 --- pool-1-thread-1
await
future1 over.
future2 over.
combine zero + zero
zero-zero
可以看出Future.join比for要好,是真正的异步并发。当然Future还可以处理异常:
def fail(a: String, b: String): Future[String] = {
    FuturePool.unboundedPool {
        println("fail operation.")
        TimeUnit.SECONDS.sleep(1)
        println("throwing exception!")
        throw new Exception("Exception.")
    }
}

//抛出异常并被捕获
def test4: Unit = {
    val result = Future.join(getFuture1, fail("a", "b")).flatMap {
        case (result1, result2) => combine(result1, result2)
    }.ensure {
        //Ensure is executed both in case of succes or failure.
        println("---ensure----")
    }.rescue {
        //Only execute when exception occurred
        case e: Exception => {
            println(e.getMessage)
            Future.False
        }
    }
    println("await")
    println(Await.result(result))
}
运行结果:
fail operation.
begin future1
future1 --- UnboundedFuturePool-1
await
throwing exception!
---ensure----
Exception.
false
rescue块可以处理异常,也仅在异常发生时执行,ensure无论是正常还是异常都会执行。

### 如何使用Scraper工具或库构建Twitter爬虫 构建Twitter爬虫通常涉及以下几个方面:了解目标网站结构、选择合适的抓取框架以及处理API限制等问题。以下是详细的说明: #### 使用`asyncio`实现快速抓取 为了提高数据抓取效率,可以利用Python中的异步编程模块`asyncio`来并行执行多个请求操作[^1]。这种方法能够显著减少等待时间,从而提升整体性能。 ```python import asyncio import aiohttp async def fetch(session, url): async with session.get(url) as response: return await response.text() async def main(): urls = ["https://twitter.com", ... ] # 添加更多URLs tasks = [] async with aiohttp.ClientSession() as session: for url in urls: task = asyncio.ensure_future(fetch(session, url)) tasks.append(task) responses = await asyncio.gather(*tasks) # 处理responses... loop = asyncio.get_event_loop() loop.run_until_complete(main()) ``` 上述代码展示了如何创建一个简单的异步HTTP客户端以并发访问多个网页资源。 #### 利用第三方库简化开发过程 除了手动编写复杂的HTML解析逻辑外,还可以借助现有的开源项目加快进度。例如,“Github”提供了一个专门用于对接其官方接口的软件包[Github API Library][^2] ,虽然它主要针对GitHub平台定制化功能设计而成,但对于理解其他社交媒体服务端点交互方式仍具有借鉴意义。 另外,《从零开始学习计算机网络》一文中提到作者通过自制Web Crawler完成了自动化职位搜索任务[^3] 。尽管该实例专注于LinkedIn而非Twitter场景应用案例分析,但它同样揭示出了通用型解决方案背后的核心原理和技术要点——即合理运用正则表达式匹配模式提取感兴趣字段内容;妥善管理Cookie保持登录状态持续有效等等实用技巧均值得参考采纳。 需要注意的是,在实际部署过程中还应特别关注目标站点robots.txt文件规定条款约束条件以免违反相关规定引发不必要的法律纠纷风险。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值