`
yy_gy
  • 浏览: 34808 次
  • 性别: Icon_minigender_2
社区版块
存档分类
最新评论

python thread(communicate, join,queue) practices

阅读更多
http://www.cnblogs.com/holbrook/archive/2012/02/23/2365420.html

"""
python多线程编程(7):线程间通信

很多时候,线程之间会有互相通信的需要。常见的情形是次要线程为主要线程执行特定的任务,在执行过程中需要不断报告执行的进度情况。前面的条件变量同步已经涉及到了线程间的通信(threading.Condition的notify方法)。更通用的方式是使用threading.Event对象。
threading.Event可以使一个线程等待其他线程的通知。其内置了一个标志,初始值为False。线程通过wait()方法进入等待状态,直到另一个线程调用set()方法将内置标志设置为True时,Event通知所有等待状态的线程恢复运行。还可以通过isSet()方法查询Envent对象内置状态的当前值。

import threading
import random
import time

class MyThread(threading.Thread):
  def __init__(self, threadName, event):
    threading.Thread.__init__(self,name=threadName)
    self.threadEvent=event

  def run(self):
    print '%s is ready'%self.name
    self.threadEvent.wait()
    print '%s run!' %self.name

sinal=threading.Event()


sinal.set()


for i in range(10):
  t=MyThread(str(i),sinal)
  t.start()


sinal.set()
"""

"""python的Thread类中还提供了join()方法,使得一个线程可以等待另一个线程执行结束后再继续运行。这个方法还可以设定一个timeout参数,避免无休止的等待。因为两个线程顺序完成,看起来象一个线程,所以称为线程的合并.对于sleep时间过长的线程,将不被等待。
import threading
import random
import time

class MyThread(threading.Thread):
  def run(self):
    wait_time=random.randrange(1,10)
    print '%s will wait %d seconds'%(self.name,wait_time)
    time.sleep(wait_time)
    print '%s wakes up!' %self.name

if __name__=='__main__':
  threads=[]
  for i in range(5):
    t=MyThread()
    t.start()
    threads.append(t)

  print 'main thread is waiting for exit...'
 
  for t in threads:
    t.join(1)

  print 'main thread finished!'


后台线程

默认情况下,主线程在退出时会等待所有子线程的结束。如果希望主线程不等待子线程,而是在退出时自动结束所有的子线程,就需要设置子线程为后台线程(daemon)。方法是通过调用线程类的setDaemon()方法。如下:
import threading
import random
import time

class MyThread(threading.Thread):
  def run(self):
    wait_time=random.randrange(1,10)
    print '%s will wait %d seconds'%(self.name,wait_time)
    time.sleep(wait_time)
    print '%s finished!' %self.name

if __name__=='__main__':
  print 'main thread is waitting for exit.....'

  for i in range(5):
    t=MyThread()
    t.setDaemon(True)
    t.start()

  print 'main thread finished!'
"""

"""
python多线程编程(6): 队列同步

前面介绍了互斥锁和条件变量解决线程间的同步问题,并使用条件变量同步机制解决了生产者与消费者问题。

让我们考虑更复杂的一种场景:产品是各不相同的。这时只记录一个数量就不够了,还需要记录每个产品的细节。很容易想到需要用一个容器将这些产品记录下来。

Python的Queue模块中提供了同步的、线程安全的队列类,包括FIFO(先入先出)队列Queue,LIFO(后入先出)队列LifoQueue,和优先级队列PriorityQueue。这些队列都实现了锁原语,能够在多线程中直接使用。可以使用队列来实现线程间的同步。

用FIFO队列实现上述生产者与消费者问题的代码如下:

import threading
import time
from Queue import Queue

class Producer(threading.Thread):

  def run(self):
    global queue
    count=0
    while True:
      for i in range(100):
        if queue.qsize()>1000:
          pass
        else:
          count=count+1
          msg='produce '+str(count)
          queue.put(msg)
          print msg
        time.sleep(1)

class Consumer(threading.Thread):
  def run(self):
    global queue
    while True:
      for i in range(3):
        if queue.qsize()<100:
          pass
        else:
          msg=self.name+'consume '+ queue.get()
          print msg
        time.sleep(1)

queue=Queue()

def test():
  for i in range(500):
    queue.put('product '+ str(i))
  print 'finished'
  for i in range(2):
    p=Producer()
    p.start()
  for i in range(5):
    c=Consumer()
    c.start()

if __name__=='__main__':
  test()
"""
分享到:
评论

相关推荐

    python shell

    使用`Thread`类可以创建新线程,`start()`方法启动线程,`join()`方法等待线程完成。 2. **多进程**:multiprocessing模块则提供了类似线程的多进程支持。每个进程拥有独立的内存空间,这使得它们之间数据隔离,但...

    Python入门教程 超详细1小时学会Python

    ### Python入门教程:高效掌握Python的核心知识点 #### 一、Python简介及应用场景 **Python**是一种高级编程语言,以其简洁的语法和强大的功能受到广大开发者的喜爱。它不仅适用于新手学习,也是专业开发者构建...

    py-communicate-final.zip

    Python提供多种IPC方法,如管道(Pipe)、套接字(Socket)、消息队列(Message Queue)等。PyQt5也提供了QProcess类,可以用来启动、控制外部程序并与其交换数据。"py-communicate-final"项目可能就利用了QProcess...

    Machine Learning with Python for Everyone

    Fenner relies on plain-English stories, pictures, and Python examples to communicate the ideas of machine learning. Mark begins by discussing machine learning and what it can do; introducing key ...

    Python Data Analytics 无水印pdf 0分

    Inside, you will see how intuitive and flexible it is to discover and communicate meaningful patterns of data using Python scripts, reporting systems, and data export. This book examines how to go ...

    Python Data Analytics(Apress,2015)

    Inside, you will see how intuitive and flexible it is to discover and communicate meaningful patterns of data using Python scripts, reporting systems, and data export. This book examines how to go ...

    # hsl-communicate通讯,hsl-communicate用于pc与三菱plc进行通讯使用

    【标题】:hsl-communicate通讯技术:实现PC与三菱PLC的高效连接 【内容】: 在工业自动化领域,通信技术是连接不同设备、系统的关键,使得数据交换成为可能。hsl-communicate是一个专门针对PC与三菱PLC(可编程...

    Python调用系统命令的6种方法

    output, error = process.communicate() ``` 4. **subprocess.call()** `subprocess.call()` 与 `os.system()` 类似,但提供了更多灵活性。它执行指定的命令并返回命令的退出状态码。例如: ```python import...

    Perl Best Practices: Standards and Styles for Developing Maintainable Code

    Perl Best Practices author Damian Conway explains that rules, conventions, standards, and practices not only help programmers communicate and coordinate with one another, they also provide a reliable...

    Python 入门详细教程-1天学会 Python.docx

    ### Python 入门详细教程-1天学会 Python #### 一、引言 本文档旨在为初学者提供一份详尽的Python入门指南,通过一天的学习,帮助读者掌握Python的基础知识和基本技能。Python是一种广泛使用的高级编程语言,以其...

    python 捕获shell脚本的输出结果实例

    ### Python 捕获Shell脚本的输出结果实例详解 在日常开发工作中,有时我们需要让Python脚本调用外部的Shell命令并获取其输出结果。本文将详细介绍如何使用Python来捕获Shell脚本的输出结果,并通过几个示例进行演示...

    communicate

    本程序 本应由TC3.0 编译环境下 完成 DOS的串行通信程序(简单)

    基于Python Flask框架的共享自习室预约系统论文.doc

    5. **交流管理模块** (Communication Management Module): Provides a platform for users to communicate with each other, ask questions, share notes, or form study groups, fostering a collaborative ...

    IPC inter-process-communicate

    #### 2.4 消息队列(Message Queue) 消息队列允许进程间传递结构化数据。每个消息都有唯一的标识符,进程可以选择发送或接收特定的消息。 #### 2.5 共享内存(Shared Memory) 共享内存允许进程直接访问同一块...

    Python-SubprocessesforHumans20

    在Python编程中,子进程管理是一个重要的领域,特别是在执行外部命令、系统操作或者需要与操作系统交互时。"Subprocesses for Humans 2.0"是一个针对Python子进程管理的库,旨在提供更易于理解和使用的接口,使...

    communicate_java_通信_

    本文将深入探讨"communicate_java_通信_"这个主题,讲解如何使用Java进行通信,以及如何实现一个基本的类似QQ的通信软件。 首先,我们需要理解Java中的网络编程基础。Java通过Socket编程提供了TCP/IP协议的支持,...

Global site tag (gtag.js) - Google Analytics