condition

并发:同时处理多个请求,但是内核采用轮询时间片的方式逐个访问,某一时间点实际只处理一个任务

比如:IO多路复用,协程,循环服务器,单线程

 

并行:使用多个内核,同时执行多个任务

比如:多进程 多线程

======================================================================

condition 条件变量

创建条件变量对象

con=threading.Condition()

con.acquire();对资源加锁,加锁后其他位置再加锁,则阻塞

con.release():解锁

con.wait():要求wait函数只能在加锁的状态下使用。

    wait函数会先解锁(release),然后让线程处于等待通知的阻塞状态。

con.notify():发送通知,其他线程接收到通知后,结束wait阻塞,并且执行acquire加锁操作

import threading
import time
import datetime

num=0

#条件变量
con=threading.Condition()

class Gov(threading.Thread):
    def run(self):
        global num
        con.acquire()
        while True:
            print("开始拉升")
            num+=1
            print("拉升到%d"%num)
            time.sleep(2)
            if num==5:
                print("差不多了")
                con.notify()
                print("准备收割")
                con.wait()
        con.release()
        print("========")        

class Consumer(threading.Thread):
    def run(self):
        global num
        con.acquire()
        while True:
            if num>0:
                print("开始收割")
                num-=1
                print("下降到%d"%num)
                time.sleep(2)
                if num==0:
                    print("OH,My GOD!!!")
                    con.notify()
                    print("come on baby")
                    con.wait()
        con.release()
        
t1=Gov()
t2=Consumer()
t1.start()
t2.start()                    
            
yangrui@ubuntu:~/num6$ python3 condition.py 
开始拉升
拉升到1
开始拉升
拉升到2
开始拉升
拉升到3
开始拉升
拉升到4
开始拉升
拉升到5
差不多了
准备收割
开始收割
下降到4
开始收割
下降到3
开始收割
下降到2
开始收割
下降到1
开始收割
下降到0
OH,My GOD!!!
come on baby
开始拉升
拉升到1
开始拉升
拉升到2
开始拉升
拉升到3
开始拉升
拉升到4
开始拉升
拉升到5
差不多了
准备收割
开始收割
下降到4
结果

 python线程之GIL(全局解释器锁)

GIL问题:由于pytho的全局解释器锁造成python的多线程执行效率低下

解决方法:

*使用多线程,使用多进程

*不使用c 或者c++做解释器

*python线程适合高延时的IO操作,如网络IO,但不适合CPU密集型程序

posted @ 2019-07-16 17:17  sike8  阅读(156)  评论(0编辑  收藏  举报