《Python》进程收尾线程初识

一、数据共享

  from multiprocessing import Manager

  把所有实现了数据共享的比较便捷的类都重新又封装了一遍,并且在原有的multiprocessing基础上增加了新的机制list、dict

  机制:支持的数据类型非常有限

    list、dict都不是数据安全的,需要自己加锁来保证数据安全

from multiprocessing import Manager,Process,Lockdef work(d,lock):with lock:d['count'] -= 1if __name__ == '__main__':lock = Lock()with Manager() as m:   # m = Manager()dic = m.dict({'count':100})p_lst = []for i in range(10):p = Process(target=work, args=(dic, lock))p_lst.append(p)p.start()for p in p_lst:p.join()print(dic)
#{'count': 90}
with ......一大段语句
dis模块
python的上下文管理
在执行一大段语句之前,自动做某个操作  open
在执行一大段语句之后,自动做某个操作  close面向对象的魔术方法(双下杠杠方法)
# 回调函数 in Poolimport os
from multiprocessing import Pooldef func(i):print('第一个任务', os.getpid())return '*'*idef call_back(res):   #回调函数print('回调函数:', os.getpid())print('res--->', res)if __name__ == '__main__':p = Pool()print('主进程', os.getpid())p.apply_async(func, args=(1,), callback=call_back)p.close()p.join()

  func执行完毕之后执行callback函数

  func的返回值会作为callback的参数

  回调函数是在主进程中实现的

  应用场景:子进程有大量运算要做,回调函数等待结果做简单处理

import re
from urllib.request import urlopen
from multiprocessing import Poolurl_lst = ['http://www.baidu.com','http://www.sohu.com','http://www.sogou.com','http://www.4399.com','http://www.cnblogs.com',
]def get_url(url):response = urlopen(url)ret = re.search('www\.(.*?)\.com', url)print('%s finished' % ret.group(1))return ret.group(1),response.read()def call(content):url,con = contentwith open(url+'.html', 'wb')as f:f.write(con)
if __name__ == '__main__':p = Pool()for url in url_lst:p.apply_async(get_url,args=(url,),callback=call)p.close()p.join()
子进程去访问网页,主进程处理网页的结果

 

二、线程理论基础

  进程是计算机中最小的资源分配单位,进程对于操作系统来说还具有一定的负担

  创建一个进程,操作系统分配的资源大约有:代码,数据,文件等

1、为什么要有线程

  线程是轻量级的概念,他没有属于自己的进程资源,一条线程只负责执行代码,没有自己独立的代码、数据以及文件

  线程是计算机中能被CPU调用的最小的单位,当前大部分计算机中的CPU都是执行的线程中的代码

  线程与进程之间的关系:每一个进程中都至少有一条线程在工作

线程的特点:

  同一个进程中的所有线程的资源是共享的

  轻量级, 没有自己的资源

进程与线程之间的区别:    

  占用的资源、调度的效率、资源是否共享

线程的并行问题:

  线程可以并行:java、c++,c#等

  在cpython中,一个进程中的多个线程是不可以并行的

  原因是:Cpython解释器内部有一把全局解释器锁GIL,所以线程不能充分利用多核,同一时刻同一进程中的线程只有一个能被cpu执行

  GIL锁确实是限制了你程序的效率,但目前可以帮助你提高线程之间切换的效率

  如果是想写高计算型的就要多进程或者换一个解释器

2、threading 模块

# 并发import os
from threading import Threaddef func(i):print('子线程:', i, os.getpid())print('主线程', os.getpid())
for i in range(10):t = Thread(target=func, args=(i,))t.start()
# 进程和线程的差距import os
import time
from threading import Thread
from multiprocessing import Processdef func(i):print('子:', os.getpid())if __name__ == '__main__':start = time.time()t_lst = []for i in range(100):t = Thread(target=func, args=(i,))t.start()t_lst.append(t)for t in t_lst:t.join()end = time.time()-startstart = time.time()t_lst = []for i in range(100):p = Process(target=func, args=(i,))p.start()t_lst.append(p)for p in t_lst:p.join()end2 = time.time()-startprint(end, end2)
#0.0279843807220459 13.582834720611572
# 线程间的数据共享from threading import Threadnum = 100
def func():global numnum -= 1            #每个线程都-1

t_lst = []
for i in range(100):t = Thread(target=func)   #创建一百个线程
    t.start()t_lst.append(t)
for t in t_lst:t.join()
print(num)   #0 

Thread 类的其他用法

Thread实例对象的方法# isAlive(): 返回线程是否活动的。# getName(): 返回线程名。# setName(): 设置线程名。

threading模块提供的一些方法:# threading.currentThread(): 返回当前的线程变量。# threading.enumerate(): 返回一个包含正在运行的线程的list。正在运行指线程启动后、结束前,不包括启动前和终止后的线程。# threading.activeCount(): 返回正在运行的线程数量,与len(threading.enumerate())有相同的结果。
from threading import currentThread,Thread
def func():time.sleep(2)t = Thread(target=func)
t.start()
print(t.is_alive())    #True(判断线程是否活着)
print(t.getName())  #Tread-1
t.setName('tt')
print(t.getName())   #tt(改名字)def func():print('子线程:', currentThread().ident)time.sleep(2)
print('主线程:',currentThread().ident)
t = Thread(target=func)
t.start()
#currentThread().ident返回线程的pidfrom threading import enumerate
def func():print('子进程:', currentThread().ident)time.sleep(2)print('主进程:', currentThread().ident)
for i in range(10):t = Thread(target=func)t.start()
print(len(enumerate()))
#enumerate()返回一个包含正在运行的线程的list,len(list)from threading import activeCount
def func():print('子线程:', currentThread().ident)time.sleep(2)print('主线程:', currentThread().ident)
for i in range(10):t = Thread(target=func)t.start()
print(activeCount())
#activeCount()返回正在运行的线程数量,与len(threading.enumerate())有相同的结果
示例

3、守护线程

import time
from threading import Threaddef func():while True:time.sleep(1)print(123)def func2():print('func2 start')time.sleep(3)print('func2 end')t1 = Thread(target=func)
t2 = Thread(target=func2)
t1.setDaemon(True)
t1.start()
t2.start()
print('主线程代码结束')
# func2 start
#主线程代码结束
#123
#123
#func2 end

 

  守护线程 是在主线程代码结束之后,再等待子线程执行结束后才结束

  主线程结束  就意味着主进程结束

  主线程等待所有的线程结束

  主线程结束了以后  守护线程会随着主进程的结束而随之结束  不是随着代码的结束而结束

  

#################################################################################

线程
线程和进程之间的关系
每个进程内都有一个线程
线程是不能独立存在的
线程和进程之间的区别
同一个进程中线程之间的数据是共享的
进程之间的数据是隔离的
线程是被cpu执行的最小单位
操作系统调度
进程是计算机中最小的资源分配单位
python
GIL锁 全局解释器锁 全局锁
cpython解释器中的
锁线程 :同一时刻同一个进程只会有一个线程访问CPU
锁的是线程而不是数据
当程序是高IO型的 多线程
当程序是高计算(CPU)型的 多进程
cpu*1 ~ cpu*2

threading
Thread
守护线程 :主线程结束之后才结束

socket_server IO多路复用 + 多线程
框架 并发的效果 :多线程、协程的概念 flask
爬虫 :线程池 协程

set、dict、list
生成器
面向对象的进阶 :魔术方法
管道
socket_server的源码

转载于:https://www.cnblogs.com/yzh2857/p/9699875.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/388427.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

北京修复宕机故障之旅

2012-12-18日 下午开会探讨北京项目出现的一些问题,当时记录的问题是由可能因为有一定数量的客户上来后,就造成了Web服务器宕机,而且没有任何时间上的规律性,让我准备出差到北京,限定三天时间,以及准备测试…

一般线性模型和混合线性模型_从零开始的线性混合模型

一般线性模型和混合线性模型生命科学的数学统计和机器学习 (Mathematical Statistics and Machine Learning for Life Sciences) This is the eighteenth article from the column Mathematical Statistics and Machine Learning for Life Sciences where I try to explain som…

《企业私有云建设指南》-导读

内容简介第1章总结性地介绍了云计算的参考架构、典型解决方案架构和涉及的关键技术。 第2章从需求分析入手,详细讲解了私有云的技术选型、资源管理、监控和运维。 第3章从计算、网络、存储资源池等方面讲解了私有云的规划和建设,以及私有云建设的总体原则…

太原冶金技师学院计算机系,山西冶金技师学院专业都有什么

山西冶金技师学院专业大全大家在考试之后对除了选择学校之外,还更关注专业的选择,山西冶金技师学院有哪些专业成了大家最为关心的问题。有些同学一般是选择好专业再选择自己满意的学校,下面小编将为你介绍山西冶金技师学院开设的专业及其哪些…

海南首例供港造血干细胞志愿者启程赴广东捐献

海南首例供港造血干细胞志愿者启程赴广东捐献。 张瑶 摄 海南首例供港造血干细胞志愿者启程赴广东捐献。 张瑶 摄 中新网海口1月23日电 (张茜翼 张瑶)海南省首例供港造血干细胞捐献者晶晶(化名)23日启程赴广东进行捐献,将于28号正式捐献采集造血干细胞,为…

如何击败Python的问题

Following the previous article written about solving Python dependencies, we will take a look at the quality of software. This article will cover “inspections” of software stacks and will link a free dataset available on Kaggle. Even though the title say…

KindEditor解决上传视频不能在手机端显示的问题

KindEditor自带的上传视频生成的HTML代码为<embed>&#xff0c;在手机端并不支持。于是可以自己在控件里增加生成video标签相关代码。 参考https://www.jianshu.com/p/047198ffed92。。 然而对着修改后没有成功&#xff0c;可能是那里没有改对吧。依然生成的是<embed&…

《独家记忆》见面会高甜宠粉 张超现场解锁隐藏技能

1月23日&#xff0c;由爱奇艺出品&#xff0c;小糖人联合出品的沉浸式成长练爱剧《独家记忆》在京举行粉丝见面会。爱奇艺高级副总裁陈宏嘉&#xff0c;爱奇艺副总裁、自制剧开发中心总经理、《独家记忆》总制片人戴莹&#xff0c;小糖人董事长、《独家记忆》总制片人朱振华&am…

计算机软件技术基础fifo算法,软件技术基础真题

一、填空1、数据结构按逻辑结构可分为两大类&#xff0c;它们分别是线性和非线性2.1、在长为n的顺序存储的线性表中插入和删除元素时所需移动元素的平均次数(等概率情况下)为&#xff1a;Einn/2&#xff0c;Ede(n-1)/22.2、顺序表有5个元素&#xff0c;设在任何位置上插入元素是…

NOI 2016 优秀的拆分 (后缀数组+差分)

题目大意&#xff1a;给你一个字符串&#xff0c;求所有子串的所有优秀拆分总和&#xff0c;优秀的拆分被定义为一个字符串可以被拆分成4个子串&#xff0c;形如$AABB$&#xff0c;其中$AA$相同&#xff0c;$BB$相同&#xff0c;$AB$也可以相同 作为一道国赛题&#xff0c;95分…

多元线性回归 python_Python中的多元线性回归

多元线性回归 pythonVideo Link影片连结 This episode expands on Implementing Simple Linear Regression In Python. We extend our simple linear regression model to include more variables.本集扩展了在Python中实现简单线性回归的方法 。 我们扩展了简单的线性回归模型…

关于apache和tomcat集群,线程是否占用实验

测试目的&#xff1a; 测试在apache入口的时候进入&#xff0c;当Tomcat的一个请求陷入死循环&#xff0c;或者线程进入循环无反应的时候&#xff0c;是否此时占用apache的线程资源。 测试原因&#xff1a; 如果要是影响&#xff0c;无论tomcat线程设置成多大&#xff0c;都…

爬虫之数据解析的三种方式

一&#xff0c;正则表达式解析 re正则就不写了&#xff0c;前面已经写入一篇很详细的正则表达式模块了~ 而且&#xff0c;在爬虫中&#xff0c;下面两种方式用的多一些~ 正则表达式&#xff1a;https://www.cnblogs.com/peng104/p/9619801.html 大致用法&#xff1a; pattern …

相对于硬件计算机软件就是,计算机的软件是将解决问题的方法,软件是相对于硬件来说的...

计算机网络管理软件是为计算机网络配置的系统软件。它负责对网络资源进行组织和管理&#xff0c;实现相互之间的通信。计算机网络管理软件包括网络操作系统和数据通信处理程序。前者用于协调网络中各计算机的操作系统及实现网络资源的传递&#xff0c;后者用于网络内的通信&…

数据冒险控制冒险_劳动生产率和其他冒险

数据冒险控制冒险Labor productivity is considered one of the most important indicators of a country’s well-being. However, we don’t know so much about it, let’s try to figure out how it is calculated, and how things are with it in the world (data source:…

Java后端WebSocket的Tomcat实现

原文&#xff1a;https://www.cnblogs.com/xdp-gacl/p/5193279.html 一.WebSocket简单介绍 随着互联网的发展&#xff0c;传统的HTTP协议已经很难满足Web应用日益复杂的需求了。近年来&#xff0c;随着HTML5的诞生&#xff0c;WebSocket协议被提出&#xff0c;它实现了浏览器与…

knn 邻居数量k的选取_选择K个最近的邻居

knn 邻居数量k的选取Classification is more-or-less just a matter of figuring out to what available group something belongs.分类或多或少只是弄清楚某个事物所属的可用组的问题。 Is Old Town Road a rap song or a country song?Old Town Road是说唱歌曲还是乡村歌曲…

EXTJS+JSP上传文件带进度条

需求来源是这样的&#xff1a;上传一个很大的excel文件到server&#xff0c; server会解析这个excel&#xff0c; 然后一条一条的插入到数据库&#xff0c;整个过程要耗费很长时间&#xff0c;因此当用户点击上传之后&#xff0c;需要显示一个进度条&#xff0c;并且能够根据后…

什么样的代码是好代码_什么是好代码?

什么样的代码是好代码编码最佳实践 (Coding Best-Practices) In the following section, I will introduce the topic at hand, giving you a sense of what this post will cover, and how each argument therein will be approached. Hopefully, this will help you decide w…

nginx比较apache

话说nginx在大压力的环境中比apache的表现要好&#xff0c;于是下载了一个来折腾一下。 下载并编译安装&#xff0c;我的编译过程有点特别&#xff1a; 1。去除调试信息&#xff0c;修改$nginx_setup_path/auto/cc/gcc这个文件&#xff0c;将 CFLAGS"$CFLAGS -g" …