随笔分类 -  并发编程

转载请注明出处:https://www.cnblogs.com/lyj910313/
摘要:线程之间本身是数据共享的,当多个线程同时修改一份数据的时候,数据就可能不 准确,特别是线程量特别大的时候,为了保证数据准确性: (1) 通过线程锁Lock (2)通过local数据隔离 from threading import local, Thread loc = local() # 生成一个对 阅读全文
posted @ 2019-04-29 22:23 夜雨潇湘子 阅读(173) 评论(0) 推荐(0)
摘要:# spawn(函数,参数...) 启动一个协成 # join() 阻塞,直到某个协程执行完毕 # joinall 类似于join 只不过 g1.join() g2.join() gevent.joinall([g1,g2]) 一次性把所有需要阻塞的协程对象写到一起 # value 获取协成的返回值 阅读全文
posted @ 2019-04-29 22:15 夜雨潇湘子 阅读(682) 评论(0) 推荐(0)
摘要:# 对于服务器自己本身,一个程序只能绑定一个端口 # 同一个端口可以多个客户端来连接, # 只要server_ip+ server_port +client_ip + cilent_port 不一样,就是唯一 客户端我这里只写一个,基本大同小异,下面的都是服务端的 client: import so 阅读全文
posted @ 2019-04-28 22:33 夜雨潇湘子 阅读(363) 评论(0) 推荐(0)
摘要:最近在看Python的多线程,经常我们会听到老手说:“Python下多线程是鸡肋,推荐使用多进程!”,但是为什么这么说呢? 要知其然,更要知其所以然。所以有了下面的深入研究: 首先强调背景: 1、GIL是什么? GIL的全称是Global Interpreter Lock(全局解释器锁),来源是py 阅读全文
posted @ 2019-04-28 22:32 夜雨潇湘子 阅读(167) 评论(0) 推荐(0)
摘要:回调函数 就是一个参数,将这个函数作为参数传到另一个函数里面. 函数先执行,再执行当参数传递的这个函数,这个参数函数是回调函数 语法: tp.submit(func,i).add_done_callback(call_back) 定义的call_back函数就是一个回调函数 (1)线程池 >是由子线 阅读全文
posted @ 2019-04-28 22:31 夜雨潇湘子 阅读(178) 评论(0) 推荐(0)
摘要:协程: 也叫纤程,协程是线程的一种实现,指的是一条线程能够在多任务之间来回切换的一 种实现,对于CPU、操作系统来说,协程并不存在 任务之间的切换会花费时间.目前电脑配置一般线程开到200会阻塞卡顿 . 协程的实现: 协程帮助你记住哪个任务执行到哪个位置上了,并且实现安全的切换 一个任务一旦阻塞卡顿 阅读全文
posted @ 2019-04-28 22:30 夜雨潇湘子 阅读(219) 评论(0) 推荐(0)
摘要:# 新版本的进程池 ProcessPoolExecutor # 实例化进程池 ProcessPoolExcutor(cpu_count) # 异步提交任务 submit / map # 阻塞直到任务完成 shutdown # 获取子进程的返回值 result # 使用回调函数 add_done_ca 阅读全文
posted @ 2019-04-28 22:28 夜雨潇湘子 阅读(2231) 评论(0) 推荐(0)
摘要:# 线程池 # 实例化线程池 ThreadPoolExcutor (推荐cpu_count*(n+1)) # 异步提交任务 submit / map # 阻塞直到任务完成 shutdown # 获取子线程的返回值 result # 使用回调函数 add_done_callback (1)基本用法: 阅读全文
posted @ 2019-04-28 22:28 夜雨潇湘子 阅读(198) 评论(0) 推荐(0)
摘要:线程常用队列有: queue LifoQueue PriorityQueue 语法: 大致和进程队列语法一致 put 往队列当中放值,超过队列长度,直接加阻塞 get 如果获取不到加阻塞 put_nowait 如果放入的超过了队列长度,直接报异常错误 get_nowait 如果获取到直接报异常错误 阅读全文
posted @ 2019-04-28 22:25 夜雨潇湘子 阅读(495) 评论(0) 推荐(0)
摘要:# ### 定时器:指定时间执行任务 from threading import Timer def func(): print("目前正在执行任务") t = Timer(5,func) #5秒后执行func函数 t.start() print("主线程") 阅读全文
posted @ 2019-04-28 22:23 夜雨潇湘子 阅读(134) 评论(0) 推荐(0)
摘要:语法:wait from threading import Condition con= Condition() conn.acquire() conn.wait() 也可以传参指定等待时间,不传参相当于阻塞,根据notify数量放行 wait下面写上相应逻辑代码 con.release() #语法 阅读全文
posted @ 2019-04-28 22:22 夜雨潇湘子 阅读(148) 评论(0) 推荐(0)
摘要:<一>Event事件 线程Event基本和进程的Event语法是一样的 # wait() 动态给程序加阻塞 # set() 将内部属性改成True # clear() 将内部属性改成False # is_set() 判断当前属性(默认是False) e = Event() print(e.is_se 阅读全文
posted @ 2019-04-28 22:21 夜雨潇湘子 阅读(154) 评论(0) 推荐(0)
摘要:(1)线程之间虽然数据共享,但是多个线程同时修改同一份数据,依然会造成数据的不准确,因此,也需要加 上线程锁Lock,用法和进程锁一样,只不过是从threading里面导包 # (1)常见情况引发的死锁问题,模拟4个人吃一碗面 from threading import Thread,Lock im 阅读全文
posted @ 2019-04-28 22:19 夜雨潇湘子 阅读(151) 评论(0) 推荐(0)
摘要:# (1) 一个进程可以有多个线程 一个进程至少有一个线程 #(2) 并发多线程和多进程的速度对比 多线程更快 #(3) 多个线程共享同一份进程资源 #(4)setDaemon 守护线程:等待其他所有子线程结束之后,自动结束 语法;线程.setDaemon(True) 线程相关函数 语法: from 阅读全文
posted @ 2019-04-28 22:18 夜雨潇湘子 阅读(180) 评论(0) 推荐(0)
摘要:#进程是资源分配的最小单位 #线程是计算机中调度的最小单位 #线程的缘起 资源分配需要分配内存空间,分配cpu: 分配的内存空间存放着临时要处理的数据等,比如要执行的代码,数据 而这些内存空间是有限的,不能无限分配 目前来讲,普通机器,5万个并发程序已是上限.线程概念应用而生. #线程的特点 线程是 阅读全文
posted @ 2019-04-28 22:17 夜雨潇湘子 阅读(94) 评论(0) 推荐(0)
摘要:Manager 能够实现进程之间的数据共享(dict list),但是必须上锁来确保数据的准确性, 队列则可以实现进程之间数据通信 from multiprocessing import Process , Manager ,Lock def work(d,lock): # 自动上锁和解锁 with 阅读全文
posted @ 2019-04-28 22:15 夜雨潇湘子 阅读(134) 评论(0) 推荐(0)
摘要:消费者模型-->存和取得过程 和Queue队列区别:解决了Queue队列拿取完,程序阻塞不能自动关闭(依靠放入None来解决)的问题 >参见上个例子 put 存入, get 获取 q.task_done 通过队列其中一个数据被处理,JoinableQueue 默认会计数,执行一次task_done减 阅读全文
posted @ 2019-04-28 22:14 夜雨潇湘子 阅读(177) 评论(0) 推荐(0)
摘要:# IPC Inter-Process Communication # 实现进程之间通信的两种机制: # 管道 Pipe 用的很少 # 队列 Queue 队列的特征:现进先出,栈属于后进后出 基本语法:from multiprocessing import Queue q = Queue(3) 传参 阅读全文
posted @ 2019-04-28 22:12 夜雨潇湘子 阅读(179) 评论(0) 推荐(0)
摘要:(1)# 开启过多的进程并不一定提高你的效率 因为进程池可以实现并行的概念,比Process单核并发的速度要快 # 如果cpu负载任务过多,平均单个任务执行的效率就会低,反而降低执行速度. 1个人做4件事和4个人做4件事 显然后者执行速度更快, 前者是并发,后者是并行 利用进程池,可以开启cpu的并 阅读全文
posted @ 2019-04-28 22:10 夜雨潇湘子 阅读(177) 评论(0) 推荐(0)
摘要:# 阻塞事件 : e = Event()生成事件对象e e.wait()是给程序加阻塞 , 程序当中是否加阻塞完全取决于该对象中的is_set() [默认返回值是False] e.wait(2) 传参,相当于time.sleep(2) # 如果是True 那就不加阻塞 # 如果是False 就加阻塞 阅读全文
posted @ 2019-04-28 22:09 夜雨潇湘子 阅读(258) 评论(0) 推荐(0)