【Day34】Pyhotn之路——网络编程
- 守护进程
(1)守护进程在主进程代码运行结束后,就自动终止
(2)守护进程内无法开启子进程,否则报错AssertionError: daemonic processes are not allowed to have children
注意:进程之间相互独立的,主进程运行完毕后,守护进程随即结束
from multiprocessing import Process import os,time, random def func():print('%s ruing '%os.getpid())time.sleep(0.2)print('%s end'%os.getpid())# p = Process(target=func) #在子进程内创建以个子进程,报错# p.start()if __name__ == '__main__':P = Process(target=func)P.daemon = TrueP.start()# P.join()# 使主进程必须等到子进程运行完毕print('主')
from multiprocessing import Process from threading import Thread import time def foo():print(123)time.sleep(1)print("end123")def bar():print(456)time.sleep(3)print("end456")if __name__ == '__main__':p1=Process(target=foo)p2 = Process(target=bar)p1.daemon=Truep1.start()p2.start()print("main-------")#打印出“main”意味着主进程结束,守护进程也就结束了,然而p2并不是守护进行,主进程需等到p2运行完毕,才能结束,否则会产生孤儿进程
迷惑人的例子
- 守护线程
守护线程需要等到其他非守护线程执行完,才结束。
from threading import Thread import time, os, randomdef func():print('%s is ruing'% os.getpid())time.sleep(2)print("%s end"% os.getpid())t = Thread(target=time.sleep,args=(3,))t.start()if __name__ == '__main__':t = Thread(target=func)t.start()print('主')
from multiprocessing import Process from threading import Thread import time def foo():print(123)time.sleep(1)print("end123")def bar():print(456)time.sleep(3)print("end456")if __name__ == '__main__':t1=Thread(target=foo)t2 = Thread(target=bar)t1.daemon=Truet1.start()t2.start()print("main-------")
迷惑人的例子
- 互斥锁:把并发变成了串行,牺牲效率提高安全性
进程同步锁
def func():# mutex.acquire()print('%s is runing'%os.getpid())time.sleep(2)print('%s end'%os.getpid())time.sleep(random.randint(1,3))# mutex.release()if __name__ == '__main__':p = Process(target=func)p1 = Process(target=func)p2= Process(target=func)p3 = Process(target=func)p.start()p1.start()p2.start()p3.start()# mutex = Lock()# p = Process(target=func,args=(mutex,))# p1 = Process(target=func,args=(mutex,))# p2 = Process(target=func,args=(mutex,))# p3 = Process(target=func,args=(mutex,))# p.start()# p1.start()# p2.start()# p3.start()
模拟抢票:
from multiprocessing import Process,Lock import os,time import json from random import randint # def sehch(): # with open('text.txt',encoding='utf-8')as f: # dic = json.load(f) # print('%s 剩余票数%s'%(os.getpid(),dic['count'])) # def get(): # # with open('text.txt',encoding='utf-8')as f: # dic = json.load(f) # if dic['count'] > 0: # dic['count'] -=1 # time.sleep(randint(1,3)) # with open("text.txt",'w',encoding='utf-8')as f: # json.dump(dic,f) # print('购票成功%s'%os.getpid()) # def task(mutex): # sehch() # mutex.acquire() # get() # mutex.release() # if __name__ == '__main__': # mutex = Lock() # for i in range(20): # p = Process(target=task,args=(mutex,)) # p.start()
模拟抢票
- 互斥锁——线程
from threading import Thread import time, os, random n = 100 def func():# global n# mutex.acquire()# tem = n# n = tem -1# mutex.release()global n# with mutex:tem = ntime.sleep(0.1)n = tem -1 if __name__ == '__main__':li = []# mutex = Lock()for i in range(100):t = Thread(target=func)li.append(t)t.start() #在创建进程和线程时,使用的Thread, Process 时需要使用start进行启动for t in li: #使用with时,可以省略使用acquire,和release 两个函数 t.join()print(n)
结果为99
from threading import Thread import time, os, random n = 100 def func():# global n# mutex.acquire()# tem = n# n = tem -1# mutex.release()global nwith mutex:tem = nn = tem -1 if __name__ == '__main__':li = []mutex = Lock()for i in range(100):t = Thread(target=func)li.append(t)t.start() #在创建进程和线程时,使用的Thread, Process 时需要使用start进行启动for t in li: #使用with时,可以省略使用acquire,和release 两个函数 t.join()print(n)
from multiprocessing import Process,Semaphore import time, os, random def task(sm):with sm:print("%s 快递"%os.getpid())time.sleep(1) if __name__ == '__main__':sm = Semaphore(3)for i in range(10):p =Process(target=task, args=(sm,))p.start()
- 进程Queue 与线程queue
Queue(3)可以限制放入的数量,但是也可以限制取出的数量,如果取出的数量大于放入的数量,则会处于停顿状态,一直等待放入数据
(2)Queue 是先进先出
from multiprocessing import Queue # q = Queue(3) # q.put({"a":1}) # q.put({"a":2}) # print(q.get())
- 线程queue队列
import queue q = queue.Queue(3) q.put('a') print(q.get())
- 优先级队列:
import queue q = queue.PriorityQueue(3) q.put((1,21)) #put()参数为元组,元组第一个为优先级,数越小,优先级越高print(q.get())“”“ (1, 21) ”“”
- 堆栈:后进先出
import queue q = queue.LifoQueue(3) q.put((1,21))print(q.get()) """(1, 21)"""
- 生产者消费者模型
from multiprocessing import Process, Queue import time, os, randomdef gieve(q):for i in range(10):res = '包子%s'%itime.sleep(0.5)q.put(res)print('%s 生产了 包子%s'%(os.getpid(),res))q.put(None) def get_e(q):while True:res = q.get()if res == None:breakprint('%s 吃了 %s'%(os.getpid(),res))time.sleep(random.randint(1,3))if __name__ == '__main__':q = Queue()a = Process(target=gieve,args=(q,))s = Process(target=get_e,args=(q,))a.start()s.start()# a.join()# q.put(None)print('主')
from multiprocessing import Process, Queueimport time, os, random def gieve(q):for i in range(10): res = '包子%s'%i time.sleep(0.5) q.put(res)print('%s 生产了 包子%s'%(os.getpid(),res)) q.put(None)def get_e(q):while True: res = q.get()if res == None:breakprint('%s 吃了 %s'%(os.getpid(),res)) time.sleep(random.randint(1,3)) if __name__ == '__main__': q = Queue() a = Process(target=gieve,args=(q,)) s = Process(target=get_e,args=(q,)) a.start() s.start()# a.join() # q.put(None)print('主')
- 信号量
信号量。信号量是用于维持有限资源访问的信号。它们和锁类似,除了它们可以允许某个限制下的多个访问。它就像电梯一样只能够容纳几个人。一旦达到了限制,想要使用资源的进程就必须等待。其它进程释放了信号量之后,它才可以获得。例如,假设有许多进程需要读取中心数据库服务器的数据。如果过多的进程同时访问它,它就会崩溃,所以限制连接数量就是个好主意。如果数据库只能同时支持N=2的连接,我们就可以以初始值N=2来创建信号量。
>>> from threading import Semaphore >>> db_semaphore = Semaphore(2) # set up the semaphore >>> database = [] >>> def insert(data):db_semaphore.acquire() # try to acquire the semaphoredatabase.append(data) # if successful, proceeddb_semaphore.release() # release the semaphore >>> insert(7) >>> insert(8) >>> insert(9)
信号量的工作机制是,所有进程只在获取了信号量之后才可以访问数据库。只有N=2
个进程可以获取信号量,其它的进程都需要等到其中一个进程释放了信号量,之后在访问数据库之前尝试获取它。
转载于:https://www.cnblogs.com/huyangblog/p/7978011.html
【Day34】Pyhotn之路——网络编程相关推荐
- python网络编程难点_python之路网络编程总结(三)
2018-9-22 20:58:25 1. 端口 1.1知名端口是众所周知的端口,范围从0-1023 例: 80端口分配给HTTP服务 21 端口分配给FTP服务 1.2动态端口 : 范围从1024 ...
- python之路——网络编程
一.楔子 你现在已经学会了写python代码,假如你写了两个python文件a.py和b.py,分别去运行,你就会发现,这两个python的文件分别运行的很好.但是如果这两个程序之间想要传递一个数据, ...
- Android开发学习之路--网络编程之初体验
一般手机都是需要上网的,一般我们的浏览器就是个webview.这里简单实现下下功能,先编写Android的layout布局: <?xml version="1.0" enco ...
- java成神之路——网络编程
一 .什么是计算机网络 计算机网络是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算 ...
- Java编程之路——网络编程篇
网络编程 关注的是底层数据的传输: 与网页编程不同,网页编程是关注与用户的数据交互. 概念: 网络: 将不同区域的计算机连接到一起:区域(局域网,城域网,互联网) 地址: IP地址: 确定网络上一个绝 ...
- python之路-网络编程
一. 楔子 两个程序之间想要传递一个数据,需要用到网络通信. 二. 软件开发的架构: 第一种: 应用类: qq,微信,网盘,优酷 这一类是属于需要安装的桌面应用. 第二种: web类: 百度,知乎,博 ...
- 【二十六】Python全栈之路--网络编程基础知识
文章目录 1. 网络的概念 2. 交换机_路由器 3. 三次握手_四次挥手 1. 网络的概念 # ### 1.网络开发两大架构 早期数据交互的格式是没有网络的 两个文件之间的数据交互需要通过第三个文件 ...
- Python攻克之路-网络编程(文件上传实现思路)
需求:一个server,一个client,实现client把某个文件传到server中某个目录中 分析:实际是实现数据传输,设定一个命令和一个参数(上传的内容),连接后,让用户输入命令和要传送的内容, ...
- [SRv6]《SRv6网络编程》SRv6 OAM与随路网络测量(2/2:IFIT)
概述 本文主要介绍SRv6 OAM和数据平面Telemetry关键技术(随路网络测量) OAM:基于已有的IPv6 OAM机制进行简单扩展,实现故障管理和性能测量 随路网络测量:基于IFIT(In-s ...
最新文章
- R语言ggplot2可视化交互作用图(Interaction Plot):可视化不同分组(分类变量1)在不同剂量下(分类变量2)的箱图(box plot)、均值计算并连接成线图(line plot)
- VC++ 坐标问题总结,控件大小随窗口变化
- VTK:Utilities之ColorTransferFunction
- LNMP Nginx 499 问题 第三方回调异常
- 西南科技大学计算机专业宿舍条件怎么样,西南科技大学宿舍条件,宿舍环境图片(10篇)...
- 防止 MySQL-PHP 网站被玩弄的方法
- python 操作微信 群发_python实现给微信公众号发送消息的方法
- 当游戏遇上电视,智能大屏就能讲出新故事?
- SpringBoot+Vue实现前后端分离的财务管理系统
- linux 云锁 端口,问一下,云锁安装后还可以修改端口吗?
- 彩蛋-管理员root@‘locahost‘ 密码丢失,处理方案。
- 《电脑十万个为什么》 第四卷 第一章
- 服务端开发基础知识点
- 【入门6】函数与结构体【完结】
- Windows7自带截图工具没法保存
- Ant是什么 使用 介绍
- DailyFi - 9.20|NFT 平台 Vera 将于明日在 Polkastarter 上 IDO
- 导出微信聊天记录,使用python进行分词,生成词云
- 策略系列篇(一)—小市值轮动
- python爬虫免费python课程