一,回顾操作系统的概念

操作系统位于底层硬件与应用软件之间的一层

工作方式:向下管理软件,向上提供接口

二,进程线程的概念

  进程是一个资源单位,线程是一个最小的执行单位

    一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程

三,并行与并发

并行:
    就是有多个进程可以同时运行的叫做并行
并发:
    就是在一个处理器的情况下,切换执行,叫做并发

python无法实现并行处理,因为全局解释器锁gil导致同一时刻同一进程
只能有一个线程被运行。

GIL全局解释器锁
    但是不影响Python开多进程

多线程代码示例

import threading
import time
'''
程序在运行是有一个主线程,当程序开启多线程的时候,主线程依旧会执行,
主线程执行到最后时,并没有结束,而是在等待子线程的结束后主线程结束'''
def misc():print("听歌")time.sleep(3)print("听歌结束")def xieboke():print("写博客")time.sleep(5)print("写博客结束")#开启线程
t1=threading.Thread(target=misc)#t1,t2是一个线程对象
t2=threading.Thread(target=xieboke)t1.start()
t2.start()print("主线程")

#开启多线程的另一种方式

import threading
import time
class MyThread(threading.Thread):'''用类的继承,继承线程的方法开启线程'''def __init__(self,num):'''继承父类的__init__方法'''threading.Thread.__init__(self)self.num=numdef run(self):print("running on mythread:%s"%self.num)time.sleep(3)print("end%s"%self.num)t1=MyThread(10)
t2=MyThread(20)t1.start()
t2.start()
print("主线程")

jion的使用
    t.jion方法会阻塞主进程的运行,但不会影响其他线程的运行

setDaemon方法
    -守护线程
    当某个线程设置为守护线程的时候,它会随着主线程的结束而结束
    t.setDaemon(True)
    
线程对象下的几个方法:
        -isAlive()检测线程是否活动,返回值是布尔值
        -getName():返回线程名
        -setName():设置线程名称
        
threading模块提供的一些方法:
    threading.currentTread():返回当前线程变量
    threading.enumerate():返回一个包含正在运行的线程的list。
    threading.activeCount():返回正在运行的线程数量
    
Python对于计算密集型运行比较慢,效率低;对于IO密集型效率有明显提高

Python多线程
    互斥锁:
        互斥锁的意义就是在保护锁内代码同一时间只有一个线程在使用
        直到代码执行完成,解锁后其他线程才能执行所内代码。
    使用格式:
        -lock=threading.Lock()创建一把锁的对象
        lock.acquire()#加锁
        ....需要保护的执行语句
        lock.release()#解锁
    
    死锁与递归锁    
    代码示例:

       import threadingimport timemuteA=threading.Lock()muteB=threading.Lock()class MyThread(threading.Thread):def __init__(self):threading.Thread.__init__(self)def run(self):self.func1()self.func2()def func1(self):muteA.acquire()print("锁A执行内容",MyThread.getName(self))muteB.acquire()print("锁B执行内容",MyThread.getName(self))muteB.release()muteA.release()def func2(self):muteB.acquire()print("第二个函数的锁B",MyThread.getName(self))muteA.acquire()print("第二个函数的锁A",MyThread.getName(self))muteA.release()muteB.release()if __name__=="__main__":for i in range(10):my_thread=MyThread()my_thread.start()

形成死锁的原因在于当线程1在第二个函数中拿到锁B向下执行需要锁A的时候,线程2在函数1中
    已经拿到的锁A,在等待线程1释放B。两个线程都没有释放另一个线程需要的锁,所以就形成了死锁。
    
    
    递归锁的应用
    递归锁未避免死锁的产生,在锁内实行一个引用计数,当有一把使用是计速器加一,释放后,去除计数
    到代码在执行锁内代码时,如果有其他线程抢锁,计数如果为零,线程可以拿到锁,大于零,拒绝线程拿锁
    这样就能避免锁的重复,也就不会产生死锁
    代码示例:    
    import threading
        import time

Rlock=threading.Rlock()

class MyThread(threading.Thread):
            def __init__(self):
                threading.Thread.__init__(self)

def run(self):
                self.func1()
                self.func2()

def func1(self):
                Rlock.acquire()
                print("锁A执行内容",MyThread.getName(self))
                Rlock.acquire()
                print("锁B执行内容",MyThread.getName(self))
                Rlock.release()
                Rlock.release()

def func2(self):
                Rlock.acquire()
                print("第二个函数的锁B",MyThread.getName(self))
                Rlock.acquire()
                print("第二个函数的锁A",MyThread.getName(self))
                Rlock.release()
                Rlock.release()

if __name__=="__main__":
            for i in range(10):
                my_thread=MyThread()
                my_thread.start()
                
event方法使用:
    event方法可以让两个线程之间通信,当一个线程需要另一个线程准备数据的时候,
    event.wait(),阻塞程序的运行,直到另一个线程将数据准备完成后,使用event.set()
    返回一个true值,event.wait()接受到该值之后,线程开始运行。wait方法后可以接一个超时
    时间参数,规定在一定时间内阻塞,超时后运行。
    
    import threading
    import time
    import logging

logging.basicConfig(level=logging.DEBUG, format='(%(threadName)-10s) %(message)s',)

def worker(event):
        logging.debug('Waiting for redis ready...')

while not event.isSet():
            logging.debug("wait.......")
            event.wait(3)   # if flag=False阻塞,等待flag=true继续执行

logging.debug('redis ready, and connect to redis server and do some work [%s]', time.ctime())
        time.sleep(1)

def main():

readis_ready = threading.Event()  #  flag=False创建一个event对象
        t1 = threading.Thread(target=worker, args=(readis_ready,), name='t1')
        t1.start()

t2 = threading.Thread(target=worker, args=(readis_ready,), name='t2')
        t2.start()

logging.debug('first of all, check redis server, make sure it is OK, and then trigger the redis ready event')

time.sleep(6) # simulate the check progress
        readis_ready.set()  # flag=Ture

if __name__=="__main__":
        main()

进程multprocessing模块

multprocessing模块与threading模块使用同一套api,使用方法调用方法与threading模块一样
    
    代码示例:
    from multiprocessing import Process

import time

def f(name):
        print("hello",name,time.ctime())
        time.sleep(1)

if __name__=="__main__":
        p_list=[]
        for i in range(3):
            p=Process(target=f,args=("alvin:%s"%i,))
            p_list.append(p)
            p.start()
    
    
协程的应用:
    协程是单线程的,不能切换。因为协程对IO操作的判断由自己控制
    import time

#  可以实现并发

def consumer():

r = ''
        while True:

n = yield r
            if not n:
                return
            print('[CONSUMER] ←← Consuming %s...' % n)
            time.sleep(1)
            r = '200 OK'

def produce(c):

next(c)
        n = 0
        while n < 5:
            n = n + 1
            print('[PRODUCER] →→ Producing %s...' % n)

cr = c.send(n)

print('[PRODUCER] Consumer return: %s' % cr)

c.close()

if __name__=='__main__':

c = consumer()
        produce(c)
    
gevent模块的使用:
    from gevent import monkey
    monkey.patch_all()

import gevent
    from urllib import request
    import time

def f(url):
        print('GET: %s' % url)
        resp = request.urlopen(url)
        data = resp.read()
        print('%d bytes received from %s.' % (len(data), url))

start=time.time()

gevent.joinall([
             gevent.spawn(f, 'https://itk.org/'),
             gevent.spawn(f, 'https://www.github.com/'),
             gevent.spawn(f, 'https://zhihu.com/'),
     ])

#f('https://itk.org/')
    #f('https://www.github.com/')
    #f('https://zhihu.com/')

print(time.time()-start)  

转载于:https://www.cnblogs.com/lzh1118/p/7430014.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中的进程与线程 学习知识,我们不但要知其然,还是知其所以然.你做到了你就 ...

  10. python 进程与线程(理论部分)

    一.理论部分 一 什么是进程 进程:正在进行的一个过程或者说一个任务.而负责执行任务则是cpu. 举例(单核+多道,实现多个进程的并发执行): egon在一个时间段内有很多任务要做:python备课的 ...

最新文章

  1. (int),Int32.Parse() 和 Convert.toInt32() 的区别
  2. SAP QM 检验批上的‘容器数’
  3. 使用 rsync / scp 命令下载linux文件,显示网速和进度
  4. 为什么在Docker里使用gdb调试器会报错
  5. matlab和python哪个运行快_MATLAB比Python快吗?
  6. 微软 SQL Server 2016 迁移技术培训实验营
  7. Excel用图标集展示数据
  8. find和xargs的使用
  9. 《JavaSE系列教程》
  10. Codeforces Gym 100015G Guessing Game 差分约束
  11. 新猿木子李:0基础学python培训教程 Python操作Redis之有序集合
  12. MATLAB/Simulink模型开发乐高EV3 双足平衡机器人
  13. Longest Common Prefix_LeetCode
  14. cesm2(clm5.0)移植方法
  15. 数字化的下一个目标,就是产业链|数字思考者50人
  16. android基础 [超级详细android Activity组件解析(Activity综述,Activity生命周期,Activity启动--携带参数启动)]
  17. 报SQL异常Parameter index out of range (1 > number of parameters, which is 0).
  18. php计算日期差天数
  19. 好玩的CMD几个命令
  20. 自定义实现一个RPC框架(七)

热门文章

  1. java删除选中行数据库数据_删除DataGridView选中行并更新数据库
  2. linux tee作用,linux tee 命令使用详解(大量实例)
  3. mac设置计算机用户名,Mac用户名怎么修改 Mac修改用户名教程
  4. EXCUTE方法executeUpdate
  5. 2016学习进度记录
  6. 《新发传染病与公共安全》期末考试题答案
  7. Buckets On Hive
  8. 电工基础口诀_维修电工实用口诀大全(一)
  9. HDU - 6789
  10. 基于单片机的八路抢答器的设计