数据分析用sql还是python,sql语句和python

  数据分析用sql还是python,sql语句和python

  来自:程序员笑点低的背包(微信号:chengxuyuanxiaohui)

  ————— 第二天 —————

  ————————————

  什么是进程和线程

  有一定基础的伙伴一定要懂流程和线程。

  流程是怎样的?

  简而言之,进程就是一个APP应用的启动实例。比如你运行游戏,打开软件,进程就会打开。

  具有进程代码和开放的文件资源、数据资源和独立的内存空间。

  什么是线程?

  线程依赖于进程,是程序的实际执行者。该进程可以包含至少一个主线程或多个子线程。

  线程有自己的堆栈空间。

  有人总结得好:

  对操作系统来说,线程是最小的执行单元,进程是最小的资源管理单元。

  进程和线程由操作系统管理。

  Java线程有五种状态:

  初始化

  可运行

  运行中

  阻塞

  销毁

  五种状态之间的转换关系如下。

  然而,谁来实现线程在不同状态之间的转换呢?是JVM吗?

  不可以。JVM需要使用操作系统内核中的线程控制块(TCB)模块来改变线程的状态。这个过程需要CPU资源。

  进程和线程的痛点

  线程是如何协同工作的?

  最典型的例子是生产者/消费者模式

  一些生产者线程将数据写入队列,而一些消费者线程从队列中消费数据。

  如何用java语言实现生产者/消费者模型?

  让我们看看代码:

  publicclassproducerconsumertest { publicstaticvoidmain(string args[]} { finalqueueintegersharedqueue=new queue);线程生产者=新生产者(共享队列;线程消费者=新消费者(共享队列;producer . start(;consumer . start(;} classproducerextendthread { privatestaticfinalintmax _ queue _ size=5;最终队列共享队列;公共产品(queuesharedqueue){ super);this . shared queue=shared queue;} @ override public void run()for)intI=0;i 100I)同步(共享队列)而(共享队列。size )=MAX_QUEUE_SIZE (system。out.println))队列已满} catch(互连){ e . print stack trace);} shared queue . add(I;system . out . println(production: I I);shared queue . notify(;} } classconsumerextendthread { privatefinalqueuesharedqueue;公众咨询(queuesharedqueue){ super);this . shared queue=shared queue;} @ overridepublicvoidrun((while)true))synchronized(共享队列)while(共享队列.大小)==0) try .shared queue . wait(;} catch(互联){ { e . printstacktrace);} } int number=shared queue . poll(;System.out.println(进度消耗:)编号);

  shared queue . notify();}}}}此代码执行以下操作:

  1.定义了生产者类和消费者类。

  2.生产者类循环100次,将数据插入同步队列。

  3.使用者循环监视同步队列,并在队列中有数据时提取数据。

  4.如果队列已满(最多5个元素),则生成器被阻塞。

  5.如果队列为空,消费者将被阻止。

  上面的代码正确地实现了生产者/消费者模型,但是它不是一个高性能的实现。为什么性能不高?原因如下:

  1.它涉及到同步锁。

  2.它包括线程阻塞状态和可运行状态之间的切换。

  3.它涉及到线程上下文的切换。

  上面提到的任何一点都是非常性能密集型的操作。

  什么是协程

  正如一个进程可以有多个线程一样,一个线程也可以有多个协程。

  最重要的是,协程不是由操作系统内核管理,而是完全由程序控制(即在用户态执行)。

  这样做的好处是性能大大提升,不会像线程切换一样消耗资源。

  既然协同过程这么好,怎么用?

  由于Java的原生语法没有实现协同学(有些开源框架实现了协同学,但很少使用),我们来看看协同学在python中的实现案例,同样以生产者-消费者模型为例:

  这段代码非常简单,即使是没用过python的朋友也应该能基本看懂。

  该代码创建了一个名为consumer的协程,它在主线程中产生数据,并在协程中消费数据。

  协程,英文Coroutines,是一种比线程更加轻量级的存在。是python中的语法。当协程执行到yield关键字时,它将在那一行暂停。当主线程调用send方法发送数据时,协程将接收数据并继续执行。

  然而,yield停止进程和线程阻塞之间有一个基本的区别。进程的暂停完全由程序控制,线程的阻塞状态由操作系统内核切换。

  因此,yield

  协程的开销远远小于线程的开销。

  协同学应用过哪些编程语言?举几个栗子吧:

  协程的应用

  Lua从5.0版本开始使用协程,通过扩展库协程来实现。

  Lua语言

  就像刚才写的代码例子一样,python可以通过yield/send实现协同。在python 3.5之后,async/await成为了更好的选择。

  Python语言

  Go语言对于协程的实现非常强大和简洁,它可以轻松地创建数百个协程并并发执行。

  Go语言

  如上所述,Java语言没有协同学的原生支持,但是一些开源框架模拟了协同学的功能。感兴趣的伙伴可以看一下源代码Java语言:

  https://github.com/kilim/kilim

  Kilim框架

  1.关于协同学的概念,笑点低的背包只懂一些皮毛。希望朋友们多多指正。

  几点补充:

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: