码迷,mamicode.com
首页 > 编程语言 > 详细

多线程的理解

时间:2017-04-26 22:57:58      阅读:206      评论:0      收藏:0      [点我收藏+]

标签:表示   默认   rom   and   nbsp   color   his   boolean   生产者与消费者   

 

  • python的threading.Thread类有一个run方法,用于定义线程的功能函数,可以在自己的线程类中覆盖该方法。而创建自己的线程实例后,通过Thread类的start方法,可以启动该线程,交给python虚拟机进行调度,当该线程获得执行的机会时,就会调用run方法执行线程。
  • 每个线程一定会有一个名字,尽管上面的例子中没有指定线程对象的name,但是python会自动为线程指定一个名字。
  • 当线程的run()方法结束时该线程完成。
  • 在一个进程内的所有线程共享全局变量,能够在不适用其他方式的前提下完成多线程之间的数据共享(这点要比多进程要好)
  • 缺点就是,线程是对全局变量随意遂改可能造成多线程之间对全局变量的混乱(即线程非安全)

和进程之间的区别:

  • 进程是系统进行资源分配和调度的一个独立单位.

  • 线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源.

  • 在多线程开发中,全局变量是多个线程都共享的数据,而局部变量等是各自线程的,是非共享的
  • 区别

    • 一个程序至少有一个进程,一个进程至少有一个线程.

    • 线程的划分尺度小于进程(资源比进程少),使得多线程程序的并发性高。

    • 进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率

    • 线线程不能够独立执行,必须依存在进程中

    优缺点

    线程和进程在使用上各有优缺点:线程执行开销小,但不利于资源的管理和保护;而进程正相反。

 

使用互斥锁实现线程同步

from threading import Thread,Lock
from time import sleep

class Task1(Thread):
    def run(self):
        while True:
            if lock1.acquire():
                print("------Task 1 -----")
                sleep(0.5)
                lock2.release()

class Task2(Thread):
    def run(self):
        while True:
            if lock2.acquire():
                print("------Task 2 -----")
                sleep(0.5)
                lock3.release()

class Task3(Thread):
    def run(self):
        while True:
            if lock3.acquire():
                print("------Task 3 -----")
                sleep(0.5)
                lock1.release()

#使用Lock创建出的锁默认没有“锁上”
lock1 = Lock()
#创建另外一把锁,并且“锁上”
lock2 = Lock()
lock2.acquire()
#创建另外一把锁,并且“锁上”
lock3 = Lock()
lock3.acquire()

t1 = Task1()
t2 = Task2()
t3 = Task3()

t1.start()
t2.start()
t3.start()

  运行结果:

------Task 1 -----
------Task 2 -----
------Task 3 -----
------Task 1 -----
------Task 2 -----
------Task 3 -----
------Task 1 -----
------Task 2 -----
------Task 3 -----
------Task 1 -----
------Task 2 -----
------Task 3 -----
------Task 1 -----
------Task 2 -----
------Task 3 -----
...省略...

重要方法:
 1 t.setDaemon(True)#默认是False,True表示主线程执行到程序结尾不管子线程是否执行完,都结束程序
 2 """A boolean value indicating whether this thread is a daemon thread.
 3 
 4 This must be set before start() is called, otherwise RuntimeError is
 5 raised. Its initial value is inherited from the creating thread; the
 6 main thread is not a daemon thread and therefore all threads created in
 7 the main thread default to daemon = False.
 8 
 9 The entire Python program exits when no alive non-daemon threads are
10 left.
11 
12 """

主线程等待子线程执行:

t.join() #等待子线程执行完然后主线程接着执行,变态用法,这样子线程的并发就没有意义

t.join(2)#与上面类似,不过最多等2秒

  

event

技术分享

 

执行结果:

 

 

技术分享

队列(生产者与消费者)

技术分享

 

多线程的理解

标签:表示   默认   rom   and   nbsp   color   his   boolean   生产者与消费者   

原文地址:http://www.cnblogs.com/wangwei916797941/p/6770228.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!