并发

Python 开源异步并发框架的未来(转)

生来就可爱ヽ(ⅴ<●) 提交于 2019-12-26 18:41:47
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> Python 开源异步并发框架的未来 fantix 1.1k 2014年04月16日 发布 推荐 4 推荐 收藏 31 收藏, 8.9k 浏览 呵呵,这个标题有点大,其实只是想从零开始介绍一下异步的基础,以及 Python 开源异步并发框架的发展和互操作性。 另外,这是我在 OSTC 2014 做的一个 20140330-OSTC-分论坛1王川 http://v.youku.com/v_show/id_XNjk2ODI0ODQ4.html ,幻灯片在 这里 ,欢迎拍砖。 开源 Python 是开源的,介绍的这几个框架 Twisted 、 Tornado 、 Gevent 和 tulip 也都是开源的,最后这个演讲是在开源大会弄的,所以标题里肯定少不了开源。另外,我的 gevent3 项目也是开源的——貌似不少同学被我起的极品名字给搞混了,特别说明一下, gevent3 虽然有跟 Gevent 一样的接口外貌,但底层却是 tulip 驱动的(考虑把名字改回 gulip 之类的);请区别于将来会支持 Python 3 的 Gevent 1.1。 非阻塞 先上一段代码。请原谅我用 Python 代码充当伪代码了,但 Python 的语法实在是太简单了,忍不住啊。 import sockets = socket

LockSupport并发等待基本模型

好久不见. 提交于 2019-12-23 10:11:15
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> LockSupport并发等待基本模型。写的个测试,具体请看注释。 package test; import java.util.Set; import java.util.concurrent.CopyOnWriteArraySet; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.locks.LockSupport; /** * @author Wei.Chou(weichou2010@gmail.com) * @version 1.0, 12/08/2016 */ public class ParkTest { private static volatile boolean resulted; private static volatile boolean completed; private static volatile boolean end0; private static volatile boolean end1; private static final AtomicInteger parkCount = new AtomicInteger(0); private static

关于JVM中long和double的读取原子性

为君一笑 提交于 2019-12-17 14:21:47
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 今天看《Java并发编程实战》的书中,关于long和double的原子性有这么一段话,意思就是在JVM中,对于32位(或者以下)的数值变量都是原子性读写,但是对于long和double这种64位的操作是非原子性。分成两次32位的操作。 在以下这种操作中就会出现读取的数值错误。 线程A先写高位32位操作, 线程B读高位32位, 线程B读地位32位, 线程A写地位32位。 那么解决办法就是对变量加上volatile关键字,volatile关键字有3个主要功能,第一个就是可见性,每次直接从内存读写。第二个就是禁止指令重排序,在JVM中会对指令进行优化,优化的时候可能会对指令进行排序。第三个就是对volatile修饰的变量读取都是原子性的。 但是书上没有说操作系统的位数和JVM的位数。 所以我猜想,只有64位JVM+64位操作系统+64位硬件才能实现对64位long和double的原子性读取。 来源: oschina 链接: https://my.oschina.net/u/2250599/blog/533108

配置开发支持高并发TCP连接的Linux应用程序全攻略

不想你离开。 提交于 2019-12-09 10:42:23
1、修改用户进程可打开文件数限制 在Linux平台上,无论编写客户端程序还是服务端程序,在进行高并发TCP连接处理时,最高的并发数量都要受到系统对用户单一进程同时可打开文件数量 的限制(这是因为系统为每个TCP连接都要创建一个socket句柄,每个socket句柄同时也是一个文件句柄)。可使用ulimit命令查看系统允许 当前用户进程打开的文件数限制: [speng@as4 ~]$ ulimit -n 1024 这表示当前用户的每个进程最多允许同时打开1024个文件,这1024个文件中还得除去每个进程必然打开的标准输入,标准输出,标准错误,服务器监听 socket,进程间通讯的unix域socket等文件,那么剩下的可用于客户端socket连接的文件数就只有大概1024-10=1014个左右。 也就是说缺省情况下,基于Linux的通讯程序最多允许同时1014个TCP并发连接。 对于想支持更高数量的TCP并发连接的通讯处理程序,就必须修改Linux对当前用户的进程同时打开的文件数量的软限制(soft limit)和硬限制(hardlimit)。其中软限制是指Linux在当前系统能够承受的范围内进一步限制用户同时打开的文件数;硬限制则是根据系统 硬件资源状况(主要是系统内存)计算出来的系统最多可同时打开的文件数量。通常软限制小于或等于硬限制。

tomcat的性能与最大并发(1000)

情到浓时终转凉″ 提交于 2019-12-07 14:16:18
当一个进程有 500 个线程在跑的话,那性能已经是很低很低了。Tomcat 默认配置的最大请求数是 150,也就是说同时支持 150 个并发,当然了,也可以将其改大。 当某个应用拥有 250 个以上并发的时候,应考虑应用服务器的集群。 具体能承载多少并发,需要看硬件的配置,CPU 越多性能越高,分配给 JVM 的内存越多性能也就越高,但也会加重 GC 的负担。 操作系统对于进程中的线程数有一定的限制: Windows 每个进程中的线程数不允许超过 2000 Linux 每个进程中的线程数不允许超过 1000 另外,在 Java 中每开启一个线程需要耗用 1MB 的 JVM 内存空间用于作为线程栈之用。 Tomcat的最大并发数是可以配置的,实际运用中,最大并发数与硬件性能和CPU数量都有很大关系的。更好的硬件,更多的处理器都会使Tomcat支持更多的并发。 Tomcat 默认的 HTTP 实现是采用阻塞式的 Socket 通信,每个请求都需要创建一个线程处理。这种模式下的并发量受到线程数的限制,但对于 Tomcat 来说几乎没有 BUG 存在了。 Tomcat 还可以配置 NIO 方式的 Socket 通信,在性能上高于阻塞式的,每个请求也不需要创建一个线程进行处理,并发能力比前者高。但没有阻塞式的成熟。 这个并发能力还与应用的逻辑密切相关,如果逻辑很复杂需要大量的计算

【实战Java高并发程序设计 5】让普通变量也享受原子操作

旧时模样 提交于 2019-12-07 08:02:35
【实战Java高并发程序设计 1】Java中的指针:Unsafe类 【实战Java高并发程序设计 2】无锁的对象引用:AtomicReference 【实战Java高并发程序设计 3】带有时间戳的对象引用:AtomicStampedReference 【实战Java高并发程序设计 4】数组也能无锁:AtomicIntegerArray 有时候,由于初期考虑不周,或者后期的需求变化,一些普通变量可能也会有线程安全的需求。如果改动不大,我们可以简单地修改程序中每一个使用或者读取这个变量的地方。但显然,这样并不符合软件设计中的一条重要原则——开闭原则。也就是系统对功能的增加应该是开发的,而对修改应该是相对保守的。而且,如果系统里使用到这个变量的地方特别多,一个一个修改也是一件令人厌烦的事情(况且很多使用场景下可能只是只读的,并无线程安全的强烈要求,完全可以保持原样)。 如果你有这种困扰,在这里根本不需要担心,因为在原子包里还有一个实用的工具类 AtomicIntegerFieldUpdater 。它可以让你在不改动(或者极少改动)原有代码的基础上,让普通的变量也享受 CAS 操作带来的线程安全性,这样你可以修改极少的代码,来获得线程安全的保证。这听起来是不是让人很激动呢? 根据数据类型不同,这个 Updater 有 3 种,分别是 AtomicIntegerFieldUpdater 、

Java编发编程之原子操作与CAS原理分析

╄→尐↘猪︶ㄣ 提交于 2019-12-06 20:02:31
引子 之前的文章我们简单介绍了线程安全的三个核心概念可见性和有序性和原子性, 那么这篇文章我们就来分析一下原子性操作的实现原理 原子操作 原子本意为不可分割的最小粒子,而原子操作则为不可中断的一个或者系列操作 注意的是对一部分操作保持了原子性并不意味着就不会发生线程安全问题, 而是要保证整个临界区都是原子性的。 下面我们来分析一下cpu和java中如何实现原子操作 Cpu实现 CPU使用基于缓存加锁或者总线加锁实现多个CPU的原子性操作 cpu自动保证基本内存操作的原子性 处理器保证从系统内存当中读取或者写入一个字节是原子的,意思是当一个处理器读取一个字节时,其他处理器不能访问这个字节的内存地址,但是复杂的内存操作处理器不能自动保证其原子性,比如跨总线宽度,跨多个缓存行,跨页表的访问。 但是处理器提供总线锁定和缓存锁定两个机制来保证复杂内存操作的原子性 总线加锁使同时只有一个cpu能独占内存进行操作 原因是有可能多个处理器同时从各自的缓存中读取变量,分别进行操作,然后分别写入系统内存当中。那么想要保证读改写共享变量的操作是原子的,就必须保证CPU1读改写共享变量的时候,CPU2不能操作缓存了该共享变量内存地址的缓存。 处理器使用总线锁就是来解决这个问题的。所谓总线锁就是使用处理器提供的一个LOCK#信号,当一个处理器在总线上输出此信号时,其他处理器的请求将被阻塞住

java并发实战(一)

烂漫一生 提交于 2019-12-06 12:08:13
###多线程优势 ####1.发挥多处理器的强大能力 ####2. 建模的简单性 Servlet(单例多线程)开发人员不需要了解有多少个请求同一时刻要被处理,也不需要了解套接字是否被阻塞 在框架的作用下 直接可以当成但线程来操作 ####3. 响应更灵敏的用户界面 ###线程带来的风险 ####1.安全性 多个线程会访问共享的内存的地址,并且是并发运行的,由于缓存的存在, 这里是列表文本导致线程可能读到不正确的数据。(java 提供了多种同步机制来解决这个问题) ####2.活跃性问题(死锁) A线程等待B资源的释放,结果B资源一直不释放该资源,导致A永久的等待下去 ####3.性能问题 线程之前切换、锁等待、线程调度等和多线程相关的操作都会影响到性能 ###参考 java并发编程实战第一章 来源: oschina 链接: https://my.oschina.net/u/200745/blog/809715

Ruby的Fiber根本不是用来做并发的~

[亡魂溺海] 提交于 2019-12-05 04:30:55
本来做了一个并发抓取,以为Ruby1.9以后添加的Fiber是类似于golang那种,可以实现并发运行,可是发现效率没有提高,为了确认Fiber是不是在并发执行,于是我做了一个这样的测试代码。 首先搞一个php文件: <?php $i = intval(isset($_GET['i']) ? $_GET['i'] : (!empty($argv[1]) ? $argv[1] : 0)); if($i>0){ sleep(5-$i); } echo $i, "\n"; 然后用命令行测试,确认这个php文件是不会block的(因为没有session锁,应该不会block) time for i in {1..5}; do (curl localhost/test.php?i=$i) & if [ "$i" -eq "5" ]; then wait; fi ; done time for i in {1..5}; do (php test.php $i) & if [ "$i" -eq "5" ]; then wait; fi ; done 这里两种方式运行时间都是4秒左右,证明,是可以并行运行。 real 0m4.019s 然后用fiber执行: real 0m10.086s 10秒左右,证明这完全是一个一个在跑的。 #!/usr/bin/env ruby require 'open

拿Erlang来拯救谁?---Erlang学习总结一

試著忘記壹切 提交于 2019-12-04 12:43:48
工作中主要使用C/C++作为开发语言。 也曾在PHP,JAVA,JS, LUA 上逗留过,但对它们,我没有花费过多的精力。部分原因可能是由于工作不能实际使用这些语言来开发项目,而我的理解是它们对我的吸引力还不够。 但是,当我偶遇上了Erlang,一见如故人,竟然能完全满足我在梦中试图用C++无数次勾勒的形象,甚至是让我惊艳的。 于是,借着Armstrong先生的《面对软件错误构建可靠的分布式系统》和《Erlang程序设计》,与这一故人已畅谈两星期有余。 Erlang为什么吸引我?现做一理性总结: 1. Erlang的动态类型,模式匹配,基于消息,面向并发的纯函数式开发范式( 由这些特性直接导出以下几点); 2. 据说,Erlang开发效率是C/C++的9倍(待验证); 3. 用C/C++开发服务端,我需要纠结于采用什么网络库,或是重头造轮子自己搞一套,还要对数据解包打包等等其他一些基础设施做封装,然后才能开始业务代码的编写,而Erlang把这一切都搞定了(IO能力已得到我的验证),我可以一开始就编写业务相关代码; 4. 用C++编码,我要用层层的try-catch块包裹正常的功能代码,而这样看起来总是让人厌烦,Erlang倡导的速错哲学让我完全不用关心什么地方会有未捕获的异常抛出把我的程序弄崩了; 5. 用C++,有N多个类都有Init(),Start(),Stop()