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 并发(通信) 第十三课 (课堂笔记)的更多相关文章

  1. 潭州课堂25班:Ph201805201 WEB 之 页面编写 第四课 登录注册 (课堂笔记)

    index.html 首页 <!DOCTYPE html> <html lang="en"> <head> <meta charset=& ...

  2. 潭州课堂25班:Ph201805201 WEB 之 页面编写 第三课 (课堂笔记)

    index.html <!DOCTYPE html> <html lang="en"> <head> <meta charset=&quo ...

  3. 潭州课堂25班:Ph201805201 WEB 之 页面编写 第二课 (课堂笔记)

    index.html <!DOCTYPE html> <html lang="en"> <head> <meta charset=&quo ...

  4. 潭州课堂25班:Ph201805201 WEB 之 页面编写 第一课 (课堂笔记)

    index.html <!DOCTYPE html> <html lang="en"> <head> <meta charset=&quo ...

  5. 潭州课堂25班:Ph201805201 第十课 类的定义,属性和方法 (课堂笔记)

    类的定义 共同属性,特征,方法者,可分为一类,并以名命之 class Abc: # class 定义类, 后面接类名 ( 规则 首字母大写 ) cls_name = '这个类的名字是Abc' # 在类 ...

  6. 潭州课堂25班:Ph201805201 并发(协程) 第十五课 (课堂笔记)

    #斐波那契 def fid(n): res = [] indx = 0 a = 0 b = 1 while indx < n : res.append(b) a,b = b,a+b indx + ...

  7. 潭州课堂25班:Ph201805201 并发(进程,线程) 第十一课 (课堂笔记)

    线程,进程,是实现并发的方法, 并行: 在同一时刻,同时运行多个任务,CPU 的数量大于等于任务数量, 并发: 在同一时间间隔内, 同时处理多个任务, 并行是并发. 进程:表示一个正在执行的程序, 操 ...

  8. 潭州课堂25班:Ph201805201 并发 第九课 (课堂笔记)

    TCP/IP 1,建立连接(三次握手) 1,客户端发起请求 2,服务器请求回应 3,请求确认,双方建立连接 2,数据传输 3,断开连接(四次挥手) 1,客户端请求断开 连接 2,服务器回应请求 3,服 ...

  9. 潭州课堂25班:Ph201805201 并发(进程与线程池) 第十四课 (课堂笔记)

    循环执行一个线程 # -*- coding: utf-8 -*- # 斌彬电脑 # @Time : 2018/7/20 0020 5:35 import threading import queue ...

随机推荐

  1. 驱动开发--【字符设备、块设备简介】【sky原创】

    驱动开发   字符设备,块设备,网络设备   字符设备 以字节流的方式访问, 不能随机访问 有例外,显卡.EEPROM可以随机访问   EEPROM可以擦写1亿次,是一种字符设备,可以随机访问 读写是 ...

  2. 带你玩转Visual Studio——带你理解微软的预编译头技术

    原文地址:http://blog.csdn.net/luoweifu/article/details/49010627 不陌生的stdafx.h 还记得带你玩转Visual Studio——带你新建一 ...

  3. zabbix3.0监控centos当主机cpu使用率超过90%的时候报警

    在windows系统中监控cpu利用率非常容易,自带模板就有这样的功能,但是在linux里面没有默认的模板 只有cpu的负载,默认当cpu的负载在一定时间内5以上报警 cpu utilization中 ...

  4. 类(字符串型;日期时间型;Math)

  5. spark简单总结—短小精悍

    Spark是基于内存计算的大数据并行计算框架.因为其基于内存计算,较Hadoop中MapReduce计算框架具有更高的实时性,同时保证了高效容错性和可伸缩性.从2009年诞生于AMPLab到现在已经成 ...

  6. vue之导入Bootstrap以及jQuery的两种方式

    Vue引入bootstrap主要有两种方法 方法一:在main.js中引入,此方法导入的bootstrap中对于html,body的一些预设置的css样式可能无效. 一.引入jQuery 在当前项目的 ...

  7. Deep Learning系统实训之一:深度学习基础知识

    K-近邻与交叉验证 1 选取超参数的正确方法是:将原始训练集分为训练集和验证集,我们在验证集上尝试不同的超参数,最后保留表现最好的那个. 2 如果训练数据量不够,使用交叉验证法,它能帮助我们在选取最优 ...

  8. Gym100340 线性dp

    //看题解写的 https://blog.csdn.net/sdfzyhx/article/details/51804748#include<bits/stdc++.h> using na ...

  9. 对象奔驰E2000

    <script> window.onload = function (ev) { // 调用对象前先创建 // 2 var vcar=new Car("奔驰",&quo ...

  10. Linux环境下Node.js的安装配置

    1.   官网下载Node.js 2.   安装Node.js 根据下载内容的不同,提供三种安装方法,选择自己喜欢的方式 2.1.   绿色免安装版(Linux(.tar.gz)) 解压Node-XX ...