数据分析用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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。