Python多线程同步

对Python多线程实现同步机制及其遇到的一些问题。本文给出了样例代码 ,主要包括Condition,Event and Queue三种机制

1. 锁机制

threading的Lock类,用该类的acquire函数进行加锁,用realease函数进行解锁,当一个线程调用锁的acquire()方法获得锁时,锁就进入“locked”状态。每次只有一个线程可以获得锁。如果此时另一个线程试图获得这个锁,该线程就会变为“blocked”状态,称为“同步阻塞”

在此没有给出样例后面条件

2.条件 Contidion

代码段:

class Reader(threading.Thread):

def __init__(self, condition, data):

threading.Thread.__init__(self)

self.condition = condition

self.data = data

pass

def run(self):

while True:

with self.condition:

print("waiting...")

self.condition.wait()

msg = self.data.pop()

if "exit" == str(msg).lower():

print ("exit")

break

print("read date:{}".format(msg))

def test_condition():

condition = threading.Condition()

dl=[]

reader = Reader(condition, dl)

reader.daemon = True

reader.start()

while True:

with condition:

msg = input("输入:")

dl.append(msg)

print("notify...")

condition.notifyAll()

if "exit" == msg.lower():

break

time.sleep(0.012)

2.事件 Event

代码段:

class Reader2(threading.Thread):

def __init__(self, event, data):

threading.Thread.__init__(self)

self.event = event

self.data = data

pass

def run(self):

while True:

print("waiting...")

self.event.wait()

msg = self.data.pop()

if "exit" == str(msg).lower():

print ("exit")

break

print("read date:{}".format(msg))

def test_event():

event = threading.Event()

dl=[]

reader2 = Reader2(event, dl)

reader2.daemon = True

reader2.start()

while True:

msg = input("输入:")

dl.append(msg)

print("notify...")

event.set()

event.clear()

if "exit" == msg.lower():

break

time.sleep(0.012)

pass

2.队列 Queue

代码段:

class Reader3(threading.Thread):

def __init__(self, queue):

threading.Thread.__init__(self)

self.queue = queue

def run(self):

while True:

print("waiting...")

msg = self.queue.get()

print("read data: {}".format(msg))

if "exit" == msg.lower():

break

self.queue.task_done()

pass

def test_queue():

q = queue.Queue()

reader3 = Reader3(q)

reader3.daemon = True

reader3.start()

while True:

msg = input("输入:")

q.put(msg)

print("notify...")

time.sleep(0.01)

if "exit" == msg.lower():

break

pass

参考文档:https://zhuanlan.zhihu.com/p/27963810

原文地址:https://www.cnblogs.com/bongem/p/11804123.html

时间: 2024-10-18 10:22:35

Python多线程同步的相关文章

Python 多线程同步队列模型

Python 多线程同步队列模型 我面临的问题是有个非常慢的处理逻辑(比如分词.句法),有大量的语料,想用多线程来处理. 这一个过程可以抽象成一个叫"同步队列"的模型. 具体来讲,有一个生产者(Dispatcher)一方面从语料中读入句子,并且存入队列中,一方面看有没有空闲的消费者(Segmentor),如果有,就把句子从队列中弹出并交给这个空闲的消费者处理. 然后消费者把处理完成的结果交给生产者输出,生产者要保证输出与输入顺序一致. 消费者是典型的threading,它需要看见生成者

python多线程同步实例分析

进程之间通信与线程同步是一个历久弥新的话题,对编程稍有了解应该都知道,但是细说又说不清.一方面除了工作中可能用的比较少,另一方面就是这些概念牵涉到的东西比较多,而且相对较深.网络编程,服务端编程,并发应用等都会涉及到.其开发和调试过程都不直观.由于同步通信机制的原理都是想通的,本文希通过望借助python实例来将抽象概念具体化. 阅读之前可以参考之前的一篇文章:python多线程与多进程及其区别,了解一下线程和进程的创建. python多线程同步 python中提供两个标准库thread和thr

python多线程同步机制Semaphore

#!/usr/bin/env python # -*- coding: utf-8 -*- """ Python 线程同步机制:Semaphore """ import time import threading import random # 信号量同步基于内部计数器,每调用一次acquire(),计数器减1:每调用一次release(),计数器加1.当计数器为0时,acquire()调用被阻塞. sema = threading.Semaph

python多线程同步机制condition

#!/usr/bin/env python# -*- coding: utf-8 -*- import threadingimport time def customer(cond): t = threading.currentThread() with cond: # wait()方法创建了一个名为waiter的锁,并且设置锁的状态为locked.这个waiter锁用于线程间的通讯 cond.wait() print '{}: Resource is available to consumer

python多线程同步机制Lock

#!/usr/bin/env python# -*- coding: utf-8 -*- import threadingimport time value = 0lock = threading.Lock() def add(): global value with lock: new_value = value + 1 time.sleep(0.001) value = new_value if __name__ == '__main__': threads = [] for i in ra

【python标准库学习】thread,threading(二)多线程同步

继上一篇介绍了python的多线程和基本用法.也说到了python中多线程中的同步锁,这篇就来看看python中的多线程同步问题. 有时候很多个线程同时对一个资源进行修改,这个时候就容易发生错误,看看这个最简单的程序: import thread, time count = 0 def addCount(): global count for i in range(100000): count += 1 for i in range(10): thread.start_new_thread(ad

python多线程、多进程以及GIL

多线程 使用threading模块创建线程 传入一个函数 这种方式是最基本的,即调用threading中的Thread类的构造函数,然后指定参数target=func,再使用返回的Thread的实例调用start()方法,即开始运行该线程,该线程将执行函数func,当然,如果func需要参数,可以在Thread的构造函数中传入参数args=(-).示例代码如下 import threading #用于线程执行的函数 def counter(n): cnt = 0; for i in xrange

Python多线程(threading)学习总结

注:此文除了例子和使用心得是自己写的,很多都是Python核心编程中的原文.原文文风应该能看出来,就不每个地方单独表明出处了. 线程(有时被称为轻量级进程)跟进程有些相似,不同的是,所有的线程运行在同一个进程中,共享相同的运行环境.它们可以想像成是在主进程或"主线程"中并行运行的"迷你进程". 线程有开始,顺序执行和结束三部分.它有一个自己的指令指针,记录自己运行到什么地方.线程的运行可能被抢占(中断),或暂时的被挂起(也叫睡眠),让其它的线程运行,这叫做让步.一个

python 多线程探索

前面已经了解过了,python多线程效率较低的主要原因是存在GIL,即Global Interpreter Lock(全局解释器锁).这里继续详细的看下GIL的说明与如何避免GIL的影响,从而提高python多线程的执行效率.什么是GIL首先需要明确的一点是GIL并不是Python的特性,它是在实现Python解析器(CPython)时所引入的一个概念.就好比C++是一套语言(语法)标准,但是可以用不同的编译器来编译成可执行代码.有名的编译器例如GCC,INTEL C++,Visual C++等