博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
潭州课堂25班:Ph201805201 并发(通信) 第十三课 (课堂笔记)
阅读量:5020 次
发布时间:2019-06-12

本文共 3075 字,大约阅读时间需要 10 分钟。

from multiprocessing import Process#  有个 url 列表 ,有5个 url ,一次请求是1秒,5个5秒# 要求1秒把 url 请求完,a = []      #  在进程中数据不共享,#  解决: 将其变成共享n = 1def 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,Managerfrom threading import Thread#  此列要求在 linux 中x = 0n = 1000000# GIL 锁,保证了同一时间只有一个线程在运行def fun1(n):    global x    for i in range(n):        x +=1def fun2(n):    global x    for i in range(n):        x -= 1if __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,Managerimport threadingimport time# lock = threading.Lock()     #  实例 LOCK 锁lock = threading.RLock()     #  实例 RLOCK 锁x = 0n = 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# 获取数据  getq.put(1)        #  # 添加数据q.put(2)        #  # 添加数据q.put(3)        #  # 添加数据print(q.get())  # 获取数据      1print(q.get())  # 获取数据      2print(q.get())  # 获取数据      3print(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:26import queueimport threadingimport timeq = 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('添加数据')

  

 

转载于:https://www.cnblogs.com/gdwz922/p/9333583.html

你可能感兴趣的文章
构造以及析构函数的调用
查看>>
去除底部“自豪地采用 WordPress”版权信息----最后附最新版的删除方法!!
查看>>
对文件下载的补充
查看>>
gradle项目中profile的实现
查看>>
winfrom中将panel另存为图片
查看>>
向服务器发送Post或Get请求(封装好的)
查看>>
Bugs -----The largest and most interesting kind of thing.
查看>>
获取验证码倒计时
查看>>
面向对象 -- 类--对象--属性--__init__方法 --绑定方法,---非绑定方法,---拓展 # 20...
查看>>
根据浏览器窗口大小而变化
查看>>
买了将近20天的东西,还没到我手
查看>>
微信小程序---绘图
查看>>
实验四
查看>>
JDK JRE JVM
查看>>
排球计分程序
查看>>
基于twitter bootstrap的时间控件
查看>>
luoguP2048 超级钢琴
查看>>
二,常用类
查看>>
MD5 Message Digest Algorithm MD5(中文名为消息摘要算法第五版)
查看>>
C函数tolower,与toupper
查看>>