Python之多线程:线程互斥与线程同步

一、锁在多线程中的使用:线程互斥

lock = threading.Lock()#创建一个锁对象

1、with lock:

pass

和进程使用的方式相同

2、控制线程结束的时间

通过一个全局变量

# encoding=utf-8

import threading,time,Queue,random

exitFlag = False

def write(lock,queue):

while exitFlag != True:

with lock:

data = random.randint(1,100)

print ‘put:‘,data

queue.put(data)

time.sleep(1)

def read(queue):

while exitFlag != True:

print ‘get:‘,queue.get()

time.sleep(1)

if __name__ == ‘__main__‘:

lock = threading.Lock()

queue = Queue.Queue()

t1 = threading.Thread(target=write,args=(lock,queue))

t2 = threading.Thread(target=write,args=(lock,queue))

t3 = threading.Thread(target=read,args=(queue,))

t1.start()

t2.start()

t3.start()

time.sleep(10)

exitFlag = True

t1.join()

t2.join()

t3.join()

二、线程同步

1、生产者--消费者模式

Queue() 作为生产者和消费者的中介

from

class Producer(threading.Thread):

def __init__(self,t_name,queue):

threading.Thread.__init__(self,name=t_name)#继承父类的构造方法的目的:初始化一些线程实例,

self.data=queue

def run(self):

for i in xrange(5):

print ‘%s:%s is producing %d to the queue\n‘%(time.ctime(),self.getname(),i)

self.data.put(i)

time.sleep(2)

print ‘%s:%s put finished \n‘%(time.ctime(),self.getname(),i)

def Consumer(threading.Thread):

def __init__(self,t_name,queue):

threading.Thread.__init__(self,name=t_name)

self.data=queue

def run(self):

for i in xrange(5):

val=self.data.get()

print ‘%s:%s is consumer %d in the queue\n‘%(time.ctime(),self.getname(),val)

print ‘%s:%s consumer finished \n‘%(time.ctime(),self.getname(),i)

if __name==‘__main__‘:

queue=Queue()#没有制定队列大小,默认为无限大,可以不受限制的放入队列

producer=Producer(‘Pro‘,queue)

consumer=Consumer(‘Con‘,queue)

producer.start()

time.sleep(1)

consumer.start()

producer.join()

consumer.join()

print ‘mainThread end‘

2、Event 信号传递

event=threading.Event()

import threading,time,Queue,random

def write(lock,queue,event):

while not event.isSet():

with lock:

thread = threading.currentThread()

data = random.randint(1,100)

print ‘this is thread:‘,thread.getName(),‘put:‘,data

queue.put(data)

time.sleep(1)

def read(queue):

while not event.isSet():

print ‘get:‘,queue.get()

time.sleep(1)

if __name__ == ‘__main__‘:

lock = threading.Lock()

queue = Queue.Queue()

event=threading.Event()

t1 = threading.Thread(target=write,args=(lock,queue,event))

t2 = threading.Thread(target=write,args=(lock,queue,event))

t3 = threading.Thread(target=read,args=(queue,))

t1.start()

t2.start()

t3.start()

time.sleep(10)

event.set()

t1.join()

t2.join()

t3.join()

3、lock :只能加一把锁

4、semaphore:可以加多把锁

设置限制最多3个线程同时访问共享资源:s = threading.Semaphore(3)

5、event:线程等待某一时间的发生,之后执行逻辑

6、Condition 条件

con=threading.Condition()

使用场景:处理复杂的逻辑。基于锁来实现的

两个线程之间做一些精准的通信

线程A做了某一件事,中途需要停止

线程B做另外一件事情,线程B通知线程A

线程A继续

(1)额外提供了wait()方法和notify()方法,用于处理复杂的逻辑

(2)wait()释放锁,并且等待通知

(3)Notify()唤醒对方,可以继续下去。但是需要两个线程之间需要抢锁,谁抢到执行谁

通过(2)和(3),实现线程间的通信。

import threading

import time

product = 0

exitFlag = False

def consumer(con):

global product

while exitFlag != True:

with con:

print ‘enter consummer thread‘

if product == 0:

con.wait()

else:

print ‘now consummer 1 product‘

product -= 1

print ‘after consummer, we have ‘,product,‘product now‘

time.sleep(2)

def producer(con):

global product

while exitFlag != True:

with con:

print ‘enter producer thread‘

product += 1

con.notify()

print ‘after producer, we have ‘, product, ‘product now‘

time.sleep(2)

if __name__ == ‘__main__‘:

con = threading.Condition()

c1 = threading.Thread(target=consumer,args=(con,))

p1 = threading.Thread(target=producer, args=(con,))

c1.start()

p1.start()

time.sleep(6)

exitFlag = True

c1.join()

p1.join()

7、死锁

t1:拥有lock1锁,申请lock2锁

t2:拥有lock2锁,申请lock1锁

(1)如何尽量的保证不出现死锁:

定义锁的使用顺序

时间: 2024-11-08 22:51:26

Python之多线程:线程互斥与线程同步的相关文章

python之多线程执行和非线程执行的对比

一.非线程执行(普通的执行) 1.非线程运行,简单代码如下 #_*_coding:utf-8_*_ import time import threading a = [] b = [] def func1():     print "func1 start %s" % time.ctime()     alist = ["192.168.1.100","192.168.1.120","192.168.1.134","

python基础 多线程threading join 守护线程setDeamon 递归锁Rlock

开篇大概介绍多线程与多进程区别,详细的理论区别自己可以在其它博客搜一下,这里不再赘述 同一进程下的多个线程共享内存数据,多个线程之间没有主次关系,相互之间可以操作:cpu执行的都是线程,默认程序会开一个主线程:进程是程序以及和程序相关资源的集合:某些场景下我们可以使用多线程来达到提高程序执行效率的目的,下面就多线程的一些基础知识做简要说明 简单的多线程 1 import threading, time 2 3 def test1(x): 4 time.sleep(5) 5 print(x**x)

《python解释器源码剖析》第16章--python的多线程机制

16.0 序 在介绍多线程之前,我们要先知道线程是什么,线程是操作系统调度cpu工作的最小单元,同理进程则是操作系统资源分配的最小单元,线程是需要依赖于进程的,并且每一个进程只少有一个线程,这个线程我们称之为主线程.而主线程则可以创建子线程,一个进程中有多个线程去工作,我们就称之为多线程.关于线程,请记住两句话,这两句话我们在前面章节中也已经提过了. python中的一个线程,对应c语言中的一个线程,然后对应操作系统的一个线程,操作系统的线程我们一般称之为原生线程,这三者是一一对应的. pyth

27 Apr 18 GIL 多进程多线程使用场景 线程互斥锁与GIL对比 基于多线程实现并发的套接字通信 进程池与线程池 同步、异步、阻塞、非阻塞

27 Apr 18 一.全局解释器锁 (GIL) 运行test.py的流程: a.将python解释器的代码从硬盘读入内存 b.将test.py的代码从硬盘读入内存  (一个进程内装有两份代码) c.将test.py中的代码像字符串一样读入python解释器中解析执行 1 .GIL:全局解释器锁 (CPython解释器的特性) In CPython, the global interpreter lock, or GIL, is a mutex that prevents multiple na

秒杀多线程第九篇 经典线程同步总结 关键段 事件 互斥量 信号量

版权声明:本文为博主原创文章,未经博主允许不得转载. 前面<秒杀多线程第四篇一个经典的多线程同步问题>提出了一个经典的多线程同步互斥问题,这个问题包括了主线程与子线程的同步,子线程间的互斥,是一道非常经典的多线程同步互斥问题范例,后面分别用了四篇 <秒杀多线程第五篇经典线程同步关键段CS> <秒杀多线程第六篇经典线程同步事件Event> <秒杀多线程第七篇经典线程同步互斥量Mutex> <秒杀多线程第八篇经典线程同步信号量Semaphore> 来

转----秒杀多线程第九篇 经典线程同步总结 关键段 事件 互斥量 信号量

前面<秒杀多线程第四篇一个经典的多线程同步问题>提出了一个经典的多线程同步互斥问题,这个问题包括了主线程与子线程的同步,子线程间的互斥,是一道非常经典的多线程同步互斥问题范例,后面分别用了四篇 <秒杀多线程第五篇经典线程同步关键段CS> <秒杀多线程第六篇经典线程同步事件Event> <秒杀多线程第七篇经典线程同步互斥量Mutex> <秒杀多线程第八篇经典线程同步信号量Semaphore> 来详细介绍常用的线程同步互斥机制——关键段.事件.互斥量

JAVA多线程提高二:传统线程的互斥与同步&amp;传统线程通信机制

本文主要是回顾线程之间互斥和同步,以及线程之间通信,在最开始没有juc并发包情况下,如何实现的,也就是我们传统的方式如何来实现的,回顾知识是为了后面的提高作准备. 一.线程的互斥 为什么会有线程的互斥?可以想银行取款的问题,如果不做监控,多个人同时针对一个存折取钱的时候就会出现钱不对的问题,下面我们通过两个例子来分析一下线程的互斥问题以及为什么会产生这个线程? 例子1:一个人生产信息,一个人消费信息 面向对象的思想:类 信息类 生产者 消费者 public class TriditionalTh

Python多线程(2)——线程同步机制

本文介绍Python中的线程同步对象,主要涉及 thread 和 threading 模块. threading 模块提供的线程同步原语包括:Lock.RLock.Condition.Event.Semaphore等对象. 1. Lock 1.1 Lock对象的创建 Lock是Python中最底层的同步机制,直接由底层模块 thread 实现,每个lock对象只有两种状态——上锁和未上锁,不同于下文的RLock对象,Lock对象是不可重入的,也没有所属的线程这个概念. 可以通过下面两种方式创建一

python学习笔记-(十三)线程、进程、多线程&amp;多进程

为了方便大家理解下面的知识,可以先看一篇文章:http://www.ruanyifeng.com/blog/2013/04/processes_and_threads.html 线程 1.什么是线程? 线程是操作系统能够进行运算调度的最小单位.它被包含在进程之中,是进程中的实际运作单位.一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务. 2.python GIL全局解释器锁(仅需了解) 无论你启多少个线程,你有多少个cpu, Python在执行的时