展开

关键词

十、python学习笔记--爬虫(对比效率)

# 一个简单的小爬虫,将3个页面的数据保存到data.html,对比的使用时间 """ 1、通过urlopen获取数据 2、写入文件 3、使用三个页面,通过gevent.joinal执行 (会在IO阻塞处切换),用时短 4、在Windows系统,由于捕获IO较慢。

6820

Kotlin-派发调度框架

一般开发中所接触到的接口无非是 launch, async, Dispatch.IO...,这些概念是对我们开发者来说的。进入源码的世界之后,这些概念就会被一些内部概念所替代。 搞清楚内部概念对分析源码来说非常关键。 的最小粒度-Coroutine 对没接触过的人来说,一个OOP代码的最小调度粒度是函数。 在中,最小的调度粒度是,在kotlin中叫coroutine。 外部概念内部概念 中外部概念内部概念的差别很大。对应开发者来说,一个的最小粒度coroutine,在的内部概念中叫DispatchedContinuation。 这是整个协调度里最精彩的部分,work-stealing的设计,加上把CPU-boundedIO-intensive任务区分出来,使得用了的代码效率得到极大的提升。

28830
  • 广告
    关闭

    老用户专属续费福利

    云服务器CVM、轻量应用服务器1.5折续费券等您来抽!

  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    十、python学习笔记--非爬虫(对比效率)

    # 一个简单的小爬虫,将3个页面的数据保存到data.html,对比的使用时间 """非 1、通过urlopen获取数据 2、写入文件 3、使用三个页面,通过for循环执行(非会在IO

    7120

    Android Kotlin async

    它启动了一个单独的与其它所有的一起并发的工作。 在这个模式下,只有结果通过 await 获取的时候才会启动,或者在 Job 的 start函数调用的时候。 注意,如果我们只是在 println 中调用 await,而没有在单独的中调用 start,这将会导致顺序行为,直到 await 启动该 执行并等待至它结束,这并不是惰性的预期用例。 构建async 风格的函数 我们可以定义异步风格的函数来 异步 的调用 doSomethingUsefulOne doSomethingUsefulTwo 并使用 async 建造器并带有一个显式的 在 Kotlin 的中使用这种风格是强烈不推荐的, 原因如下所述。

    29820

    有栈无栈

    当前很多的编程语言都内置特性或者有自己的库,如C/C++的libco、golang的goroutine等。而在实现机制上,又可以划分为有栈无栈,我们分别进行介绍。 我们选用两个协库进行介绍,云风的基于ucontext函数簇的libco。 ,当阻塞或者退出后,并不指定将执行权限移交给哪个协,而是统一交还给调度器(主),由调度器选择指定的子进行调度拉起。 /cIsShareStack:一系列标志变量 stStackMem_t* stack_mem;,栈空间指针 创建的接口co_create,其中 参数部分: ppco:输出变量,的地址 attr: ,这个标志位为1,表示已经运行了 在第一次调度时,会先通过接口coctx_make先为这个协构建一个上下文 而coctx_make做了什么?

    1.4K31

    c++ 20原生研究报告 上

    如果你已经对非常熟悉,尤其是知道栈(stack),帧(frame)在知识体系中意义,可以直接跳过相关章节。 一 概述 关于的定义实现,并没有像进程线程那样有统一的标准。 这一章节,我从函数切换的寄存器操作入手,继而通过的实现,不同分类标准的介绍,帮助读者理解的本质。 其他的有栈切换方式libco类似,不一一赘述。 私有栈 vs 共享栈 libco在切换之上,还提供了私有栈共享栈的封装。 简单说下其他同事讨论的相关结论: 这种方式并不会执行寄存器级的上下文保存恢复, 只是将函数执行到的行号记录在对象的成员变量中, 函数通过switch case跳转宏, 在恢复执行时跳转到指定的行号继续执行 对称只提供了一种间的控制转移的语义即pass control, 而非对称提供了两种, invokesuspend。 利用libco可以实现对称,也可以实现非对称

    9910

    c++ 20原生研究报告 下

    引言 上一章节介绍了的现状,并以libco为例介绍了主流有栈的实现原理。这一篇,我们开始进入C++20原生的研究。 上篇文章的地址: johnyao:c++ 20原生研究报告 上 一 C++20总览 这一章节我们会给出,C++20的定义,并列举需要的所有接口。 这一章节会一下涌现很多术语概念,可能你会感到有些困扰,但不用担心,后续章节会逐一解释各个接口的具体使用。 我们先看下C++20的定义。 除了这3个关键字,实现一个C++20还需要实现两个鸭子类型,分别是promise typeawaiter type。 这里需要说明一点,的语义并没有改变C++的基本语法规则,比如: co_await BaseSwapTestCoro::awaiter(); 这里会创建awaiter的一个临时变量,那么这个临时变量在该语句执行完成后就会释放

    14320

    C++|并发|libco剖析

    C++20推出了官方的库,但是在此之前C++并没有提供语法。libco是经典的C++库,本文将从源码角度分析libco,并参考了原作者的文章。 结构体 默认有128K的栈在stack_mem中,ctx表示上下文,pfnarg分别为当前函数参数,同时还有4K的私有变量数组aSpec(key是索引)。 所以创建的开销很大,为了避免开销,从池取出后只需把pfn重置为入口函数即可。 在切换完成后,即将执行的将自己的栈从buffer中取出并复制到共享栈中。 ,调用深度++,然后切换

    17710

    Coroutine(retrofit

    The answer is ${one.await() + two.await()}") } println("Completed in $time ms") } 1.4 ContextDispatcher launch 后面一共可以拥有3个 Dispatchers.Unconfined ---默认主线程,事实上却是另外的机制(FIFO,在Android中不用来更新UI) Dispatchers.Default CoroutineCallAdapterFactory能运行起来需要添加两个依赖库 implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android )MainScope。 如果要用到项目中去,那么必然会涉及到原来的retrofit共用同一个线程池。Dispatchers.Default里面分为DefaultSchedulerCommonPool。

    92120

    Java实现

    2.线程阻塞状态可运行状态之间的切换。 3.线程上下文的切换。 ,英文Coroutines,是一种比线程更加轻量级的存在。正如一个进程可以拥有多个线程一样,一个线程也可以拥有多个协,又称微线程,纤。英文名Coroutine。  最大的优势就是极高的执行效率。 因为子程序切换不是线程切换,而是由程序自身控制,因此,没有线程切换的开销,多线程比,线程数量越多,的性能优势就越明显。 因为是一个线程执行,那怎么利用多核CPU呢?最简单的方法是多进程+,既充分利用多核,又充分发挥的高效率,可获得极高的性能。 Go语言 Go语言对的实现非常强大而简洁,可以轻松创建成百上千个并发执行。

    57231

    异步IO

    的概念 (coroutine)通常又称之为微线程或纤,它是相互协作的一组子程序(函数)。所谓相互协作指的是在执行函数A时,可以随时中断去执行函数B,然后又中断继续执行函数A。 注意,这一过程并不是函数调用(因为没有调用语句),整个过程看似像多线程,然而只有一个线程执行。通过yield关键字 send()操作来转移执行权,程之间不是调用者与被调用者的关系。 说明:适合处理的是I/O密集型任务,处理CPU密集型任务并不是它的长处,如果要提升CPU的利用率可以考虑“多进程+”的模式。 Python 3.4:引入asyncio.coroutine装饰器用来标记作为的函数,函数asyncio及其事件循环一起使用,来实现异步I/O操作。 Python 3.5:引入了asyncawait,可以使用async def来定义一个函数,这个函数中不能包含任何形式的yield语句,但是可以使用return或await从中返回值。

    22850

    Android中的简易:viewModelScope

    ViewModel的作用域 CoroutineScope 会跟踪所有它创建的。因此,当你取消一个作用域的时候,所有它创建的也会被取消。 此作用域中创建的将会在 ViewModel 使用期间一直存在。 * 终止这个任务将会终止此 ViewModel 开始的所有。 它以与前一小节相同的方式管理。 学习一下怎样在 Android 应用中使用吧。

    2.1K20

    Android Kotlin之withContext()使用

    image.png withContext kotlin 中 GlobalScope 类提供了几个创建的构造函数: launch: 创建 async : 创建带返回值的,返回的是 Deferred 类 withContext:不创建新的,指定上运行代码块 runBlocking:不是 GlobalScope 的 API,可以独立使用,区别是 runBlocking 里面的 delay 会阻塞线程

    2K20

    android之GlobalScope()使用介绍

    image.png 什么是 (Coroutines)是一种比线程更加轻量级的存在,正如一个进程可以拥有多个线程一样,一个线程可以拥有多个协。 ? image.png 有一点必须明确的是,一个线程的多个协的运行是串行的。 如果是多核CPU,多个进程或一个进程内的多个线程是可以并行运行的,但是一个线程内却绝对是串行的,无论CPU有多少个核。 毕竟虽然是一个特殊的函数,但仍然是一个函数。一个线程内可以运行多个函数,但这些函数都是串行运行的。 当一个运行时,其它必须挂起。 GlobalScope.lunch GlobalScope.launch用于启动了一个运行在子线程的顶层。 GlobalScope继承于CoroutineScope(的生命周期),表示此的生命周期随应用程序的生命周期。

    1.2K20

    破解 Kotlin (8) - Android

    关键词:Kotlin Android Anko Android 上面使用来替代回调或者 RxJava 实际上是一件非常轻松的事儿,我们甚至可以在更大的范围内结合 UI 的生命周期做控制的执行状态 的原理用法我们已经探讨了很多了,关于 Android 上面的使用,我们就只给出几点实践的建议。 2. 合理使用调度器 在 Android 上使用,更多的就是简化异步逻辑的写法,使用场景更多与 RxJava 类似。 小结 这一篇文章,主要是基于我们前面讲了的理论知识,进一步往 Android 的具体实战角度迁移,相比其他类型的应用,Android 作为 UI 程序最大的特点就是异步要协调好 UI 的生命周期,也不例外 一旦我们把的作用域规则以及与 UI 生命周期的关系熟稔于心,那么相信大家使用时一定会得心应手的。

    45731

    理解、LiveData Flow

    如何启动取消协 在 Jetpack 组件里,我们为各个组件提供了对应的 scope,比如 ViewModel 就有与之对应的 viewModelScope,如果您想在这个作用域里启动,使用如下代码即可 如前所述,我们使用 LiveData 连接 View ViewModel,而在 ViewModel 这里我们则使用刚刚提到的 liveData 构造方法来打通 LiveData 和协,再往右就是调用 这时您可以使用 suspendCancellableCoroutine 构造方法,这个方法是回调之间的适配器,会在内部提供一个 continuation 供开发者使用: suspend fun 相信看到这里,您对如何在实际应用中使用、LiveData Flow 已经有了比较系统的认识。 您可以重温 Android Dev Summit 上 Jose Alcérreca Yigit Boyar 的演讲来巩固理解: 视频链接:v.qq.com/x/page/a302… 如果您对、LiveData

    89420

    Kotlin Android SQLite API 中的线程模型

    在我们为 Room 添加的支持期间,我们遇到并解决了在模型 Android SQL API 中没想到的一些问题。在本篇文章中,我们会向您阐述我们遇到的这些问题,以及我们的解决方案。 也就是说,问题的根源就是在挂起之后会继续执行所绑定的那个线程,而这样是不能保证挂起之前所绑定的线程是同一个线程。 ? 比如,Dispatchers.IO 会使用一个共享线程池分流执行那些会发生阻塞的操作,而 Dispatchers.Main 会在 Android 主线程中执行。 另外,Job 被用来挂起保持线程的可用性,直到事务执行完成为止。要注意的是,一旦被取消了或者是无法获取到线程,就要有防范措施。 直接取消 Android 线程对 SQLite 事务的限制是不可行的,因为我们希望提供一个向后兼容的解决方案,而上述这些方法的组合最终让我们在使用 Fluent API 的解决方案中发挥了创造性。

    44720

    Android中的Coroutine原理详解

    [Coroutine] 前言 是一个并发方案。也是一种思想。 传统意义上的是单线程的,面对io密集型任务他的内存消耗更少,进而效率高。但是面对计算密集型的任务不如多线程并行运算效率高。 implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.4.3" // Android支持库 implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.4.3" // Java8支持库 implementation "org.jetbrains.kotlinx 如: 高阶函数 源码实现类找不到 所以扎实的kotlin语法基本功是学习的前提。 实在看不懂得地方就反编译为java,以java最终翻译为准。 是什么?有什么用? ,的工作核心就是它内部的状态机,invokeSuspend函数 补充---相关类继承关系 [798ac87e0ce6afaa3214e76f40c49312.png] 解答question2&3 已知启动会调用体的

    12220

    线程、进程、GIL(三)

    博客链接:线程、进程、GIL(二) 这一篇来说说线程间通信的那些事儿:    一个线程向另一个线程发送数据最安全的方式就是使用queue库中的队列了,通过创建一个供多个线程共享的Queue对象,这些线程使用 put()get()操作来向队列中添加数据或者从队列中取出数据,以达到线程间通信的效果。    But、当程序员在加锁之后忘记调用release()方法,或者加锁之后程序抛异常导致不能正常释放锁,有可能会造成死锁,为了避免这种情况,我们不需要显式的手动加锁释放锁,而是使用with语句来进行自动控制 Thread, Lock num = 0 lock = Lock() # 定义一个锁 def run(): global num, lock with lock: # 自动的控制加锁释放锁

    25230

    Golang:线程 的区别

    目录 前言 的特点 第 1 第 2 点 特点中的第 3 第 4 点 线程的整体对比 前言 国庆越快各位,距离上次发文快两个月了,19年也快结束了。 看起来A B 的运行像是线程的切换,但是请注意,这里的 A B 都运行在同一个线程里面。它们的调度不是线程的切换,而是纯应用态的调度。 关于上述代码中,为什么要指定下面两行代码? 那么我们程序中的,就会被分配到不同的线程里面去了。为了演示,故设置数量 1,使得它们都被分配到了同一个线程里面,存于线程的队列里面,等待被执行或调度。 特点中的第 3 第 4 点。 因为的调度切换不是线程切换,而是由程序自身控制,因此,没有线程切换的开销,多线程比,线程数量越多,的性能优势就越明显。调度发生在应用态而非内核态。 线程的整体对比 比较的点 线程 数据存储 内核态的内存空间 一般是线程提供的用户态内存空间 切换操作 操作最终在内核层完成,应用层需要调用内核层提供的 syscall 底层函数 应用层使用代码进行简单的现场保存恢复即可

    1.5K40

    相关产品

    • TAPD 敏捷项目管理

      TAPD 敏捷项目管理

      TAPD是源自于腾讯的敏捷产品研发协作平台,提供贯穿敏捷开发生命周期的一站式服务。覆盖从产品概念形成、产品规划、需求分析、项目规划和跟踪、质量测试到构建发布、用户反馈跟踪的产品研发全周期,帮助研发团队规范和改进研发过程,提升研发效率和产品质量。

    相关资讯

    热门标签

    活动推荐

    扫码关注腾讯云开发者

    领取腾讯云代金券