线程

并发编程之线程、线程定时器、进程池、线程池(更新中....)

旧时模样 提交于 2020-04-06 11:33:58
线程queue用法 import queue q = queue.Queue() 队列 先进先出 q = queue.LifoQueue() #堆栈 先进后出 q = queue.PriorityQueue() # 可以根据优先级取数据 线程定时器 导入 from threading import Thread,Timer 使用 t = Timer(4,task) #过了4秒开启了一个线程 socket 多线程 服务端 import socket from threading import Thread def task(conn): while True: try: msg = conn.recv(1024) if len(msg) == 0:break conn.send(msg.upper()) except Exception: print("客户端关闭了一个链接") break def run(): while True: s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) s.bind(('127.0.0.1',8020)) s.listen(5) while True: conn,addr = s.accept() t = Thread(target=task,args=(conn,)) t.start() if

线程queue、线程进程池,协程

故事扮演 提交于 2020-04-06 11:32:55
线程queue import queue q = queue.Queue() #先进先出 q = queue.LifoQueue() #先进后出 t = queue.PriorityQueue() #优先级取数据,通常这个元组的第一个值是int类型 q.put('123') q.put('qweqwe') print(q.get()) print(q.get()) t.put('100', 'tank') t.put('10', 'nick') t.put('1', 'jason') print(t.get()) print(t.get()) print(t.get()) q.task_done() q.task_done() q.join() 线程定时器 from threading import Thread, Timer import time def task(): print('线程执行了') time.sleep(2) print('线程结束了') t = Timer(3, task) #过了3秒后开启了一个线程 t.start() 多线程实现socket服务端 #服务端 from threading import Thread import socket def talk(conn): while True: try: info = conn.recv(1024)

并发编程-多线程,GIL锁

倾然丶 夕夏残阳落幕 提交于 2020-04-06 11:32:00
本章内容: 1.什么是GIL 2.GIL带来的问题 3.为什么需要GIL 4.关于GIL的性能讨论 5.自定义的线程互斥锁与GIL的区别 6.线程池与进程池 7.同步异步,阻塞非阻塞 一.什么是GIL 官方解释: ''' In CPython, the global interpreter lock, or GIL, is a mutex that prevents multiple native threads from executing Python bytecodes at once. This lock is necessary mainly because CPython’s memory management is not thread-safe. (However, since the GIL exists, other features have grown to depend on the guarantees that it enforces.) ''' 释义: 在CPython中,这个全局解释器锁,也称为GIL,是一个互斥锁,防止多个线程在同一时间执行Python字节码,这个锁是非常重要的,因为CPython的内存管理非线程安全的,很多其他的特性依赖于GIL,所以即使它影响了程序效率也无法将其直接去除 总结: 在CPython中,GIL会把线程的并行变成串行

Mysql主从复制搭建

百般思念 提交于 2020-04-06 11:31:54
1.mysql主库会把所有的写操作记录在binlog日志中,并且生成log dump线程,将binlog日志传给从库的I/O线程,从库生成两个线程,一个是I/O线程,另外一个是SQL线程。 主将更改操作记录到binlog里从将主的binlog事件(sql语句) 同步本机上并记录在relaylog里从根据relaylog里面的sql语句按顺序执行。 2.主从复制步骤: 确保从数据库与主数据库里的数据一致 在主数据库里创建一个同步账户授权给从数据库使用 配置主数据库(修改配置文件) 配置从数据库(修改配置文件) 一主一从 主主复制 一主多从---扩展系统读取的性能,因为读是在从库读取的 多主一从---5.7版本开始支持 联级复制 3.需求: 搭建两台MYSQL服务器,一台作为主服务器,一台作为从服务器,主服务器进行写操作,从服务器进行读操作。 4.环境说明【使用docker启动两个】 名称 Ip Port M1 192.168.149.128 3307 M1S1 192.168.149.128 3308 5.安装【阿里云需要放掉端口3307,3308,本机关闭防火墙即可】 docker run --name M1 -p 3307:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7 docker run --name M1S1 -p 3308

学习总结(三十四)

浪子不回头ぞ 提交于 2020-04-06 11:31:04
1.线程 什么是线程 线程是操作系统最小的运算调度单位,被包含在进程中,一个线程就是一个固定的执行流程 2.线程与进程的关系 线程不能单独存在必须存在于进程中,进程是一个资源单位,其包含了运行程序所需的所有资源,线程才是真正的执行单位   没有线程,进程中的资源无法被利用起来,所以一个进程至少包含一个线程,称之为主线程,当我们启动一程序时,操作系统就会为自己这个程序创建一个主线程,线程可以由程序后期开启,自己开启线程称之为子线程 3.为什么需要线程 目的只有一个就是提高效率 4.多线程的使用方式   继承Thread类,然后重写run()方法 from threading import Thread,current_thread import time def task(): print("2",current_thread()) print("子进程running") time.sleep(10) print("子进程") if __name__ == '__main__': t=Thread(target=task) t.start() print("主线程") print("1",current_thread()) class myThread(Thread): def run(self): print("子进程tun") m=myThread() print("父进程")

进程,线程和协程

强颜欢笑 提交于 2020-04-06 10:50:27
1,任务调度 要理解进程和线程,必须要先了解一下操作系统的一些相关概念。大部分操作系统(如Windows、Linux)的 任务调度 是采用 时间片轮转的抢占式调度方式 ,也就是说一个任务执行一小段时间后强制暂停去执行下一个任务,每个任务轮流执行。任务执行的一小段时间叫做时间片,任务正在执行时的状态叫运行状态,任务执行一段时间后强制暂停去执行下一个任务,被暂停的任务就处于就绪状态等待下一个属于它的时间片的到来。这样每个任务都能得到执行,由于CPU的执行效率非常高,时间片非常短,在各个任务之间快速地切换,给人的感觉就是多个任务在“同时进行”,这也就是我们所说的并发(别觉得并发有多高深,它的实现很复杂,但它的概念很简单,就是一句话:多个任务同时执行)。多任务运行过程的示意图如下: 操作系统中的任务调度 2,进程 我们都知道计算机的核心是CPU,它承担了所有的计算任务;而操作系统是计算机的管理者,它负责任务的调度、资源的分配和管理,统领整个计算机硬件;应用程序侧是具有某种功能的程序,程序是运行于操作系统之上的。 进程 是一个具有一定独立功能的 程序在一个数据集上的一次动态执行的过程, 是应用程序运行的载体, 操作系统会以进程为单位,分配系统资源(CPU时间片、内存等资源),进程是资源分配的最小单位 。 进程一般由程序、数据集合和进程控制块三部分组成。 程序用于描述进程要完成的功能

ThreadPoolTaskExecutor 中 corePoolSize vs. maxPoolSize

三世轮回 提交于 2020-04-06 09:40:59
1. 概览 Spring中的 ThreadPoolTaskExecutor 是一个 JavaBean ,提供围绕 java.util.concurrent.ThreadPoolExecutor 的抽象实例,并作为Spring 中 org.springframework.core.task.TaskExecutor 暴露出来. 此外,它可以通过 corePoolSize、maxPoolSize、queueCapacity、allowCoreThreadTimeOut 和 keepAliveSeconds 的属性进行高度配置。在本教程中,我们将查看 corePoolSize 和 maxPoolSize 属性。 2. corePoolSize vs. maxPoolSize 刚接触到这种抽象的用户可能很容易混淆这两个配置属性的区别。因此,让我们分别看一下。 2.1. corePoolSize corePoolSize 是在不超时情况下,保持活跃的最少线程数 。它是 ThreadPoolTaskExecutor 的一个可配置项。但是, ThreadPoolTaskExecutor* 抽象将该值的设置委托给底层的 java.util.concurrent.ThreadPoolExecutor 。为验证这一点,如果我们将 allowCoreThreadTimeOut 设置为 true

Jmeter各类线程组详解

久未见 提交于 2020-04-06 06:03:45
Jmeter各类线程组详解 作者:牛刘源 了解JMeter的朋友都知道,它不仅能做简单的接口测试、还支持性能测试,接口类型不仅支持Rest、SOAP,也可扩展WebSocket、Socket等。无论你用Jmeter做哪种测试,哪种接口类型,哪种网络协议,你都必须添加使用Jmeter线程组,线程组在Jmeter中占据主导地位,它是任何一个测试计划的起点,所有的逻辑控制器、采样器、处理器、报告等都必须放在线程组之下,也就是说你若使用Jmeter做接口测试或性能测试那么,线程组是必不可少的。本文分为三个方面为大家介绍Jmeter的线程组,主要从: 线程组介绍、线程组设置、线程组分类三 方面来阐述。 一、线程组介绍: 线程组元件是任何一个测试计划的开始点。在一个测试计划中的所有元件都必须在某个线程组下。所有的任务都是基于线程组: 通俗理解: · 线程组:就是一个线程组,里面有若干个请求; · 线程:一个线程就是一个“虚拟用户”; · 请求:一个线程组里面有若干个请求。 对应关系: 例如:1个线程组里面有10个请求,线程数为10个,跑完后得到: 理解为:(10个线程数)10个人,每个人都要跑这10个请求,所以:10*10=100: 并发数:100;线程数:10; PS:线程组也可以看作是一个虚拟用户组。线程组中的每一个线程都可以理解为一个虚拟用户。 二、线程组设置:

python 第八天

情到浓时终转凉″ 提交于 2020-04-06 05:49:02
1、paramiko模块 1.1、此函数是ssh模块: import paramikodef ssh2(ip='127.0.0.1',port=22,username='',passwd='',cmd=''): """ ssh连接服务器 :return: """ ssh = paramiko.SSHClient() #创建SSH对象 ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) #允许连接不在know_hosts文件中的主机 ssh.connect(ip,int(port),username,passwd) #连接服务器 stdin,stdout,stderr = ssh.exec_command(cmd) #执行命令,标准输入,输出,错误三个变量中 result = stdout.read() #获取命令的结果,输出是字节的类型 print(result.decode("utf-8")) #将字节的类型转换为utf-8 ssh.close()ssh2("192.168.1.1",22,"root","123456","df")1.2、sftpclient: import paramikotransport = paramiko.Transport(('192.168.1.1',22))transport

图解JVM内存区域划分

你说的曾经没有我的故事 提交于 2020-04-06 05:26:26
图解JVM类加载机制和双亲委派模型 一文中讲述了 Java 类加载的过程,它包含 加载、验证、准备、解析、初始化、使用、卸载 这 7 个步骤。在准备阶段,JVM会将类加载到内存中,为类变量分配内存并赋予初值;在初始化阶段则会正式执行初始化代码。 那么在准备阶段和初始化阶段,JVM 具体是怎么为类分配内存的呢? JVM 把字节码文件加载进来之后放在哪里?代码运行的时候,方法和局部变量放在哪里?创建的对象又该放在哪里? 方法区/Metaspace:JVM加载进来的字节码文件会保存在方法区,Java8之后被称为Metaspace,里面保存类的基本信息。 字节码执行引擎:JVM 加载的字节码文件由字节码执行引擎来执行。 程序计数器:字节码是一行行的CPU指令,由CPU逐行执行,执行到哪一行了,就是由程序计数器来记录 栈内存:Java是多线程的,Java代码是由线程来执行的,每个线程都有各自的调用栈。执行方法时,栈帧进入调用栈,栈帧中有局部变量、方法返回值等信息。 堆内存:堆中保存Java创建的对象,栈中的局部变量可以持有堆中对象的引用。 最后我把整个过程串联一下: 有两个类,在使用时由JVM的类加载器进行加载,进入到方法区 由字节码执行引擎执行字节码文件 Java是多线程的,可以启动多个线程执行代码,每个线程都有自己的栈内存 执行方法,栈帧入栈,方法执行完成,栈帧出栈。栈帧中保存着局部变量