潭州课堂25班:Ph201805201 并发(通信) 第十三课 (课堂笔记)
from multiprocessing import Process # 有个 url 列表 ,有5个 url ,一次请求是1秒,5个5秒
# 要求1秒把 url 请求完,
a = [] # 在进程中数据不共享,
# 解决: 将其变成共享 n = 1 def fun():
global n
n = 2 # 做用或只在子进程 if __name__ == '__main__':
p = Process(target=fun)
p.start()
p.join()
print(n) # 打印出的是 1 子进程的修改是无效的
引入 Manager 服务器进程 实现数据的共享,
from multiprocessing import Process,Manager # 此列要求在 linux 中 def fun(d):
d['a'] = 0 # 修改变量是有效的, manager = Manager()
d = manager.dict() # 变成 manager 数据类型,实现共享 if __name__ == '__main__':
p = Process(target=fun,args=(d,))
p.start()
p.join()
print(d) # {'a': 0}
线程安全
from multiprocessing import Process,Manager
from threading import Thread # 此列要求在 linux 中 x = 0
n = 1000000
# GIL 锁,保证了同一时间只有一个线程在运行 def fun1(n):
global x
for i in range(n):
x +=1 def fun2(n):
global x
for i in range(n):
x -= 1 if __name__ == '__main__':
t1 = Thread(target=fun1,args=(n,))
t2 = Thread(target=fun2,args=(n,))
t1.start()
t2.start()
t1.join()
t2.join()
print(x) # 当 n 的值越大,x 的值越不定, 正确答案是 0 ,但实际 出来的 x 是不定的,
控制好共享数据
from multiprocessing import Process,Manager
import threading
import time # lock = threading.Lock() # 实例 LOCK 锁
lock = threading.RLock() # 实例 RLOCK 锁 x = 0
n = 1000000
# GIL 锁,保证了同一时间只有一个线程在运行
# def fun1(n):
global x
for i in range(n):
try:
lock.acquire() # 获取
x +=1
finally: # 上边不管对错,下边一定执行,
lock.release() # 释放 # 不管执行对错,必须释放锁 防止程序错误,赌死整个程序, def fun2(n):
global x
for i in range(n):
try:
lock.acquire() # 获取
x -= 1
finally: # 上边不管对错,下边一定执行,
lock.release() # 释放 if __name__ == '__main__':
t1 = threading.Thread(target=fun1,args=(n,))
t2 = threading.Thread(target=fun2,args=(n,))
st = time.time()
t1.start()
t2.start()
t1.join()
t2.join()
print(x)
print( time.time()-st ) # 原子操作:一步能完成,不会被打断,
# LOCK 锁 ,在同一时间内,一把锁只能被一个线程被获取
# RLOCK 锁,在同一个线程,可以我次获取,
# RLOCK 解决 嵌套 lock.acquire()
# lock.acquire() 赌死程序 线程,进程安全队列,
import queue # 队列 线程中使用
q = queue.Queue() # () 设置队列长度,0 无穷大, # 添加数据 put
# 获取数据 get q.put(1) # # 添加数据
q.put(2) # # 添加数据
q.put(3) # # 添加数据
print(q.get()) # 获取数据 1
print(q.get()) # 获取数据 2
print(q.get()) # 获取数据 3
print(q.get()) # 获取数据 空 q.put(1,block=False)
# block=False 如果队列已经满,立刻抛出异常,
# block=True 会一直等待, q.empty() # 是否为空
q.full() # 是否潢
q.qsize() # 队列长度
q.task_done() # 任务结束 q.join() # 等待完成
# 内部有个计数器,每 put 一次,+1,
# task_done() 一次,-1,
# 只有其计数器 = 0 时解除阻塞,
生产者与消费者模式
# -*- coding: utf-8 -*-
# 斌彬电脑
# @Time : 2018/7/19 0019 6:26 import queue
import threading
import time
q = queue.Queue() def fun1(q):
while True:
data = q.get() # 只客读取
print(data)
q.task_done() for i in range(10):
t = threading.Thread(target=fun1, args=(q,))
t.start() while True:
time.sleep(0.5)
q.put(time.time()) # 只管添加
print('添加数据')
潭州课堂25班:Ph201805201 并发(通信) 第十三课 (课堂笔记)的更多相关文章
- 潭州课堂25班:Ph201805201 WEB 之 页面编写 第四课 登录注册 (课堂笔记)
index.html 首页 <!DOCTYPE html> <html lang="en"> <head> <meta charset=& ...
- 潭州课堂25班:Ph201805201 WEB 之 页面编写 第三课 (课堂笔记)
index.html <!DOCTYPE html> <html lang="en"> <head> <meta charset=&quo ...
- 潭州课堂25班:Ph201805201 WEB 之 页面编写 第二课 (课堂笔记)
index.html <!DOCTYPE html> <html lang="en"> <head> <meta charset=&quo ...
- 潭州课堂25班:Ph201805201 WEB 之 页面编写 第一课 (课堂笔记)
index.html <!DOCTYPE html> <html lang="en"> <head> <meta charset=&quo ...
- 潭州课堂25班:Ph201805201 第十课 类的定义,属性和方法 (课堂笔记)
类的定义 共同属性,特征,方法者,可分为一类,并以名命之 class Abc: # class 定义类, 后面接类名 ( 规则 首字母大写 ) cls_name = '这个类的名字是Abc' # 在类 ...
- 潭州课堂25班:Ph201805201 并发(协程) 第十五课 (课堂笔记)
#斐波那契 def fid(n): res = [] indx = 0 a = 0 b = 1 while indx < n : res.append(b) a,b = b,a+b indx + ...
- 潭州课堂25班:Ph201805201 并发(进程,线程) 第十一课 (课堂笔记)
线程,进程,是实现并发的方法, 并行: 在同一时刻,同时运行多个任务,CPU 的数量大于等于任务数量, 并发: 在同一时间间隔内, 同时处理多个任务, 并行是并发. 进程:表示一个正在执行的程序, 操 ...
- 潭州课堂25班:Ph201805201 并发 第九课 (课堂笔记)
TCP/IP 1,建立连接(三次握手) 1,客户端发起请求 2,服务器请求回应 3,请求确认,双方建立连接 2,数据传输 3,断开连接(四次挥手) 1,客户端请求断开 连接 2,服务器回应请求 3,服 ...
- 潭州课堂25班:Ph201805201 并发(进程与线程池) 第十四课 (课堂笔记)
循环执行一个线程 # -*- coding: utf-8 -*- # 斌彬电脑 # @Time : 2018/7/20 0020 5:35 import threading import queue ...
随机推荐
- 编码器AE & VAE
学习总结于国立台湾大学 :李宏毅老师 自编码器 AE (Auto-encoder) & 变分自动编码器VAE(Variational Auto-encoder) ...
- Pytorch 之 backward
首先看这个自动求导的参数: grad_variables:形状与variable一致,对于y.backward(),grad_variables相当于链式法则dz/dx=dz/dy × dy/dx 中 ...
- STM32F103X datasheet学习笔记---DMA
1.前言 直接存储器存取(DMA)用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输. 无须CPU干预,数据可以通过DMA快速地移动,这就节省了CPU的资源来做其他操作. 两个DMA控制器 ...
- 01 响应式页面-@media介绍,
我们为什么要写自适应的页面(响应式页面) 众所周知,电脑.平板.手机的屏幕是差距很大的,假如在电脑上写好了一个页面,在电脑上看起来不错,但是如果放到手机上的话,那可能就会乱的一塌糊涂,这时候怎么解决呢 ...
- Expm 1_2 实现快速排序的算法,并尝试采用不同的方法实现线性的划分过程.
package org.xiu68.exp.exp1; public class Exp1_2 { //实现快速排序算法,采用不同的方法实现线性划分的过程 public static void mai ...
- php ajax返回无故刷新页面
1 前言 一个php页面,里面两个$.POST请求,一个会刷新页面,一个不会,然后就拉出来研究一下了,仅作为记录使用. 2 代码 HTML代码: <input value="查找&qu ...
- mysql5.7安装教程图解
启动安装包: 左边是你电脑上可以连接到mysql的软件,比如Visual Studio,Eclipse,PyCharm等,中间是需求的版本或者额外组件,右边是状态. 选择一个选项,然后点击下面的che ...
- alt-opt and end2end
关于两种训练方式的不同,论文中一种是4阶段训练,这种容易理解,还有一种是近似联合训练, 参考:http://jacobkong.github.io/posts/3802700508/ 关于两种训练方式 ...
- vue+element之多表单验证
方法一:利用promise var p1=new Promise(function(resolve, reject) { this.$refs[form1].validate((valid) => ...
- 通配符(WildCard)的使用
一.关于WildCard:一个web应用,有成千上万个action声明,可以利用struts2提供的映射机制把多个彼此相似的映射关系简化成一个映射关系,即通配符. 1.新建类 ActionWildCa ...