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 ...
随机推荐
-
phpMyAdmin在Mac OS X上的配置和使用
本文主要记录phpMyAdmin在Mac OS X上的配置和使用,避免朋友们走弯路,浪费不必要的时间. 1. 下载: 2. 在"设置"中打开" web shar ...
-
Java基础知识点
以下10点为JAVA 基础知识,后面将足以总结和完善以备面试 数据类型 (包装类,字符串,数组) 异常处理 Java IO和NIO 数据结构 (集合和容器 ) 多线程(并发) 网络通信(协议) 面向对 ...
-
完美滑动顶部固定ScrollView,合并可以上拉,下拉加载更多
先看效果: 主要处理: 使用PullToRefreshScrollView修改内部的scrollView源码,更换成可以固定顶部的自定义scrollView @Override protected S ...
-
2018-2019-2 《网络对抗技术》Exp0 Kali安装 Week1
- 2018-2019-2 <网络对抗技术>Exp0 Kali安装 Week1 - 安装过程 - 安装Kali VMware上学期已经装好了,Kali的镜像文件是从同学那拷过来的,所以这两 ...
-
SQLServer之创建分布式事务
分布式事务创建注意事项 指定一个由 Transact-SQL 分布式事务处理协调器 (MS DTC) 管理的 Microsoft 分布式事务的起点. 执行 BEGIN DISTRIBUTED TRAN ...
-
Windows10 VS2017 C++ Server Socket简单服务器端与客户端
服务端: #include "pch.h" #include<iostream> #include<WinSock2.h> #include <Ws2 ...
-
实现图片旋转木马3D浏览效果
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
-
np.random.normal()正态分布
高斯分布的概率密度函数 numpy中 numpy.random.normal(loc=0.0, scale=1.0, size=None) 参数的意义为: loc:float 概率分布的均值,对应着整 ...
-
pyspark使用ipython
在Ubuntu下,安装ipython很简单: $sudo apt-get install ipython 在bash env中添加变量: export IPYTHON=1 export IPYTHON ...
-
2.1 Linux中wait、system 分析
wait与waitpid: 当子进程退出的时候,内核会向父进程发送SIGCHID信号,子进程的退出是一个异步事件(子进程可以在父进程运行的任何时刻终止). 子进程退出时,内核将子进程置为僵尸状态,这个 ...