一、数据共享

  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

threadingThread    守护线程 :主线程结束之后才结束

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

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

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

《Python》进程收尾线程初识相关推荐

  1. python进程和线程_Python进程与线程知识

    好程序员Python 培训分享进程与线程知识 , Python 开发语言现在已经是被大家非常看中的编程语言了,本篇文章给读者们分享一下 Python 进程与线程知识小结,本篇文章具有一定的参考借鉴价值 ...

  2. python进程和线程

    python 进程和线程 概念 GIL: 全局解释锁,解决了不同线程同时访问统一资源时,数据保护问题.python 虽然是多线程,但是因为GIL,实际上是是单线程,由CPU轮询,假线程.(一个线程运行 ...

  3. python进程与线程_Python进程与线程知识

    Python培训分享进程与线程知识,Python开发语言现在已经是被大家非常看中的编程语言了,本篇文章给读者们分享一下Python进程与线程知识小结,本篇文章具有一定的参考借鉴价值,感兴趣的小伙伴来了 ...

  4. python 进程,线程,协程篇

    python 进程,线程,协程篇 ssh 线程 进程 线程,进程区别 threading 模块,两种调用方式 python GIL全局解释器锁(Global Interpreter Lock) Joi ...

  5. Python进程和线程保姆式教学,1个台机子多只手干活的秘籍

    进程线程有多重要?刚开始学Python的时候你可能还没有感觉到,因为你写的代码从上到下执行一遍就可以了,但实际上这很初级,实际开发写项目的时候,为了充分利用电脑配置来加快程序进度,我们往往会用到多进程 ...

  6. Python进程、线程、协程详解

    进程与线程的历史 我们都知道计算机是由硬件和软件组成的.硬件中的CPU是计算机的核心,它承担计算机的所有任务. 操作系统是运行在硬件之上的软件,是计算机的管理者,它负责资源的管理和分配.任务的调度. ...

  7. python进程、线程的学习心得

    什么是多线程竞争? 线程不是独立的,同一个进程里的线程,线程间的数据是共享的,多线程操作时,容易造成数据的混乱,线程不安全. 如何解决? 互斥锁. 好处:能够保证某段关键代码执行时,只有一个线程操作, ...

  8. python进程、线程、协程

    基本观点: 1.一个python进程一个GIL(全局锁),每个线程需要获取这个锁才能执行. 2.cpu密集型的程序,使用多进程. 3.IO密集型的程序,多线程可能会比多进程快. 4.多核cpu执行多进 ...

  9. python 进程和线程

    python中的进程.线程(threading.multiprocessing.Queue.subprocess) Python中的进程与线程 学习知识,我们不但要知其然,还是知其所以然.你做到了你就 ...

最新文章

  1. ucos-iii串口用信号量及环形队列中断发送,用内建消息队列中断接收
  2. bokeh pandas_使用Pandas和Bokeh将Rolling Stone的500张最伟大专辑可视化
  3. 一个利用System.gc和finalize研究Java垃圾回收机制的练习
  4. 虚拟机安装windows ghost版本系统记录完整过程
  5. 组件:参数验证、组件:事件传递
  6. [Ext JS ] 7.25.1 Form或者面板自动定位到错误的输入框
  7. sql between的用法的意思_SQL 宝典——SQL 语法速成手册
  8. html 响应式 meta,HTML - 移动端 meta viewport
  9. Windows Azure AppFabric Caching入门简介
  10. 加权平均数的例子_加权平均数公式(加权平均数公式例子)
  11. Java设置时间为0时0分0秒和23时59分59秒
  12. XEQ玻尿酸敏感肌可以用吗?效果怎么样?
  13. 雷顿学院大数据一期课程免费下载
  14. 利用身份证号码算年龄 并排序
  15. python中用sympy对变量求偏导
  16. Linux学习笔记28——Linux的权限与密码管理机制
  17. Win10开启和使用Hyper-V功能
  18. 有赞VS光云科技,电商SaaS的未来殊途同归
  19. 【无标题】监控后台视频分屏 2*3 和4*6 使用element组件Layout布局
  20. Buck电路输入电容计算方法详解,再也不用死记硬背!

热门文章

  1. Java 队列清空,如何清空Actor死信队列 - java
  2. ft服务器设置传输协议,ft服务器设置成主动模式
  3. java的方法是什么用,Java中的本机方法是什么?它们应该在何处使用?
  4. strcpy函数_错误更正(拷贝赋值函数的正确使用姿势)
  5. curl命令java_上curl java 模拟http请求
  6. 单片机c语言 i%3c%3c1,单片机C语言作业及上机习题及答案
  7. icem密度盒怎么设置_怎么做好火灾自动报警系统施工安装?
  8. 方法之输出星型及其调用
  9. axure源文件_Axure教程:实现网易云音乐有声播放效果
  10. Hibernate的CURD操作