单线程

Kafka单线程Consumer及参数详解

随声附和 提交于 2019-11-27 12:13:22
请使用0.9以后的版本: 示例代码 Properties props = new Properties(); props.put("bootstrap.servers", "kafka01:9092,kafka02:9092"); props.put("group.id", "test"); props.put("enable.auto.commit", "true"); props.put("auto.commit.interval.ms", "1000"); props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer"); props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer"); props.put("auto.offset.reset","earliest"); KafkaConsumer<String, String> consumer = new KafkaConsumer<>(props); consumer.subscribe(Arrays.asList("foo", "bar")); try{ while (true) {

Day33 并发编程(三) 线程池进程池,协程

泪湿孤枕 提交于 2019-11-27 10:41:29
1.进程池和线程池   开进程和开线程都需要消耗资源,只不过线程相比进程耗费的资源较小,但是计算机的硬件是有限制的,我们不能无限制的去开启进程或者线程.进程池和线程池能帮助我们在计算机承受的范围内最大限度的利用计算机 什么是池   在保证计算机硬件安全的情况下最大限度的利用计算机   池其实是降低了程序的运行效率,但是保证了计算机硬件的安全 怎么使用池   我们首先定义一个池子,在里边放入固定数量的进程或线程,只要有任务来了,就派一个进程或线程去处理任务,如果固定数量的进程或线程使用完了,那么接下来的任务就在外面等待,直到有进程或线程的任务执行完毕,外面的任务才可以拿到空闲的进程或线程执行,这样我们既可以同时使用多个进程或线程,又可以保证计算机硬件不会因为任务过多而导致死机等情况 注意:池子中的进程或线程的数量是固定的,可以自己定义数量,但是里边的进程或线程是不会动态改变的.例如工厂中有5个工人,一堆任务过来,他们只能同时执行5个,一个工人做完一个任务之后再做另一个任务,任务在变,但是工人是不会变的,即虽然任务在变,但是进程或线程只会创建一次,执行多少任务还是那几个,这样也节省了反复开闭进程线程的时间 #1 介绍 concurrent.futures模块提供了高度封装的异步调用接口 ThreadPoolExecutor:线程池,提供异步调用 ProcessPoolExecutor:

tcp单线程实现并发

妖精的绣舞 提交于 2019-11-27 10:23:00
服务端 from gevent import monkey;monkey.patch_all() import socket from gevent import spawn server = socket.socket() server.bind(('127.0.0.1',8080)) server.listen(5) def talk(conn): while True: try: data = conn.recv(1024) if len(data) == 0:break print(data.decode('utf-8')) conn.send(data.upper()) except ConnectionResetError as e: print(e) break conn.close() def server1(): while True: conn, addr = server.accept() spawn(talk,conn) if __name__ == '__main__': g1 = spawn(server1) g1.join() 客户端 import socket from threading import Thread,current_thread def client(): client = socket.socket() client

在单线程下利用协程实现服务端并发的效果

可紊 提交于 2019-11-27 10:06:31
import socket from threading import Thread client = socket.socket() client.connect(('127.0.0.1',8080)) def c(client,i): while True: client.send(('hello %s'%i).encode("utf-8")) data = client.recv(1024) print(data.decode('utf-8')) for i in range(400): t = Thread(target=c,args=(client,i)) # 客户端使用多线程实现并发模拟 t.start() 客户端 import socket from gevent import spawn from gevent import monkey; monkey.patch_all() server = socket.socket() server.bind(('127.0.0.1', 8080)) server.listen(5) def talk(conn): while True: try: data = conn.recv(1024) # 等待客户端发消息 阻塞态 if len(data) == 0: break print(data.decode('utf-8')

【Python协程的实现】

吃可爱长大的小学妹 提交于 2019-11-27 02:52:18
原文: http://106.13.73.98/__/7/ 补充 : 数据安全问题 进程: 多个进程操作同一个文件,会出现数据不安全线程: 多个线程操作同一个全局变量,会出现数据不安全 对于共享的数据操作: 如果是 += *= /= -= 操作,都存在数据不安全问题 如果是append,extend,pop,remove操作,就不会出现数据不安全问题协程: 永远不会出现数据不安全问题 因为协程是由程序员控制的,而程序员控制的只能是代码 协程示例代码: # 最简单的协程 a = 0 def fn1(): global a g = fn2() # 拿到生成器 next(g) # 转向fn2函数执行 a += 1 next(g) # 转向fn2函数执行 def fn2(): global a yield a += 1 yield print(fn1()) # Noneprint(a) # 2 1. 协程介绍 协程是单线程下的并发,又称微线程,纤程。英文名Coroutine。一句话说明什么是协程:协程是一种用户态的轻量级线程,即协程是由用户程序自己控制调度的. 1. Python的线程属于内核级别的,即由操作系统控制调度(如单线程遇到io或执行时间过长就会被迫交出cpu执行权限,切换其它线程运行) 2. 单线程内开启协程,一旦遇到io,就会从应用程序级别(而非操作系统)控制切换

粪发涂墙-Redis

北慕城南 提交于 2019-11-27 02:28:56
Redis的高并发和快速原因 1.redis是基于内存的,内存的读写速度非常快; 2.redis是单线程的,省去了很多上下文切换线程的时间; 3.redis使用多路复用技术,可以处理并发的连接。非阻塞IO 内部实现采用epoll,采用了epoll+自己实现的简单的事件框架。epoll中的读、写、关闭、连接都转化成了事件,然后利用epoll的多路复用特性,绝不在io上浪费一点时间。 下面重点介绍单线程设计和IO多路复用核心设计快的原因。 为什么Redis是单线程的 1.官方答案 因为Redis是基于内存的操作,CPU不是Redis的瓶颈,Redis的瓶颈最有可能是机器内存的大小或者网络带宽。既然单线程容易实现,而且CPU不会成为瓶颈,那就顺理成章地采用单线程的方案了。 2.性能指标 关于redis的性能,官方网站也有,普通笔记本轻松处理每秒几十万的请求。 3.详细原因 1)不需要各种锁的性能消耗 Redis的数据结构并不全是简单的Key-Value,还有list,hash等复杂的结构,这些结构有可能会进行很细粒度的操作,比如在很长的列表后面添加一个元素,在hash当中添加或者删除 一个对象。这些操作可能就需要加非常多的锁,导致的结果是同步开销大大增加。 总之,在单线程的情况下,就不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消耗。 2

【Python协程的实现】 -- 2019-08-11 18:40:16

半世苍凉 提交于 2019-11-27 00:04:35
原文: http://106.13.73.98/__/7/ 补充 : 数据安全问题 进程: 多个进程操作同一个文件,会出现数据不安全线程: 多个线程操作同一个全局变量,会出现数据不安全 对于共享的数据操作: 如果是 += *= /= -= 操作,都存在数据不安全问题 如果是append,extend,pop,remove操作,就不会出现数据不安全问题协程: 永远不会出现数据不安全问题 因为协程是由程序员控制的,而程序员控制的只能是代码 协程示例代码: # 最简单的协程 a = 0 def fn1(): global a g = fn2() # 拿到生成器 next(g) # 转向fn2函数执行 a += 1 next(g) # 转向fn2函数执行 def fn2(): global a yield a += 1 yield print(fn1()) # Noneprint(a) # 2 1. 协程介绍 协程是单线程下的并发,又称微线程,纤程。英文名Coroutine。一句话说明什么是协程:协程是一种用户态的轻量级线程,即协程是由用户程序自己控制调度的. 1. Python的线程属于内核级别的,即由操作系统控制调度(如单线程遇到io或执行时间过长就会被迫交出cpu执行权限,切换其它线程运行) 2. 单线程内开启协程,一旦遇到io,就会从应用程序级别(而非操作系统)控制切换

Redis学习笔记

天涯浪子 提交于 2019-11-26 13:55:01
Redis学习笔记 单线程架构 redis使用了单线程架构和I/O多路复用模型来实现高性能的内存数据库服务 为什么单线程还能这么快 纯内存访问,Redis将所有数据放在内存中,内存的响应时长大约为100ns 非阻塞I/O,Redis使用epoll作为I/O多路复用技术的实现,再加上Redis自身的事件处理模型将epoll中的连接、读写、关闭都转换为事件,不在网络I/O上浪费过多时间 单线程避免了线程切换和竞态产生的消耗 单线程问题:对于每个命令的执行时间有要求,如果某个命令执行过长,会造成其他命令的阻塞,所以Redis是面向快速执行场景的数据库。 redis数据结构 字符串 内部编码 int 8个字节的长整型 embstr:小于等于39个字节的字符串 raw:大于39个字节的字符串 redis会根据当前值得类型和长度决定使用哪种内部编码实现 使用场景 缓存功能 合理的健名设计,业务名:对象名:id:【属性】 计数 session共享 限速 哈希 内部编码 ziplist(压缩列表) 当哈希类型元素小于512 、同时所有值都小于64字节时,Redis会使用ziplist作为哈希的内部实现 hashtable(哈希表) 列表 列表中的元素是有序的 列表中的元素是可以重复的 内部编码 ziplist ziplist(压缩列表) 当列表元素小于512 、同时所有值都小于64字节时

springboot scheduled多线程

孤街浪徒 提交于 2019-11-26 06:35:03
(转)spring scheduled单线程和多线程使用过程中的大坑!!不看到时候绝对后悔!!: https://blog.csdn.net/FlyingSnails/article/details/90167434 (转) Spring定时任务@scheduled多线程的使用(@Async注解) : https://segmentfault.com/a/1190000015267976?utm_source=tag-newest 来源: https://www.cnblogs.com/ViokingJava/p/11316818.html