文档章节

thread、threading

c
 cics
发布于 2016/10/18 14:28
字数 380
阅读 2
收藏 0

互斥锁、嵌套互斥锁、条件变量、Event、local

local:全局定义,线程局部变量。其它线程环境下修改不影响其它线程

thread 

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import thread, time

g_loack = thread.allocate_lock()
g_count = 0

def func1():
    global g_count, g_loack

    #锁操作
    g_loack.acquire()
    val = g_count
    val += 1
    g_count = val
    g_loack.release()

    print 'done func1'

def func2():
    global g_count, g_loack

    #锁操作
    g_loack.acquire()
    val = g_count
    val += 1
    g_count = val
    g_loack.release()

    print 'done func2'

def add_thread():
    return thread.start_new_thread(func1), thread.start_new_thread(func2)

if __name__ == '__main__':
    thread_list = []
    for n in range(10):
        thread_list.extend(add_thread())

    time.sleep(10)
    print g_count



 

threading

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import time
import threading

g_count = 0
g_mutex_lock = threading.Lock()  #全局互斥锁
g_mutex_rlock = threading.RLock() #可重入锁,防止反复加锁造成死锁
g_condigtion = threading.Condition()  #条件变量

class TheadTest(threading.Thread):
    def __init__(self, **kwargs):
        super(TheadTest, self).__init__(**kwargs)
        self.event = threading.Event()

    def run(self):
        """
        工作函数,父类调用
        """

    def mutex_lock_test(self):
        """
        数据互斥,加锁解锁
        """
        global g_count, g_mutex_lock

        g_mutex_lock.acquire()
        #g_mutex_lock.acquire()  #重复加锁造成死锁,可使用RLock
        count = g_count
        count += 1
        g_count = count
        #g_mutex_lock.release()
        g_mutex_lock.release()

    def mutex_rlock_test(self):
        """
        重入互斥锁
        可反复加锁防止死锁
        """
        global g_count, g_mutex_rlock

        g_mutex_rlock.acquire()
        g_mutex_rlock.acquire()
        count = g_count
        count += 1
        g_count = count
        g_mutex_rlock.release()
        g_mutex_rlock.release()

    def condigtion_wait(self):
        """
        条件变量
        """
        global g_count, g_condigtion

        #加锁
        g_condigtion.acquire()
        #判断条件
        while g_count < 10:
            g_condigtion.wait()
        #循环条件不成立break
        g_condigtion.release()

    def condigtion_notify(self):
        global g_condigtion, g_count

        g_condigtion.acquire()
        g_count = 10
        g_condigtion.notify()  #激活条件变量中加锁等待的线程
        g_condigtion.release()

    def event_wait(self):
        self.event.wait()
        print 'event set'

    def event_set(self):
        self.event.set()


class TheadTestExt(TheadTest):
    def run(self):
        print 'thead name:%s' % self.name
        #self.mutex_lock_test()
        #self.mutex_rlock_test()
        #self.condigtion_wait()
        self.event_wait()


def thead_exec(cls, count=1):
    theads = [cls(name='thead num %s' % count) for count in range(count)]
    for thead in theads:
        thead.start()
    return theads

if __name__ == '__main__':

    #条件变量测试
    theads = thead_exec(TheadTestExt)
    time.sleep(1)
    theads[0].event_set()
    for thead in theads:
        thead.join()
    pass



 

© 著作权归作者所有

共有 人打赏支持
c
粉丝 0
博文 63
码字总数 5820
作品 0
广州
程序员
Python中的threading

#!/usr/bin/env python # -- coding: utf-8 -- import threading, time #新线程执行的代码: def loop(): print('thread %s is running...' % threading.current_thread().name) n = 0 while ......

io123
2016/04/01
0
0
Python中的threading

#!/usr/bin/env python # -- coding: utf-8 -- import threading, time #新线程执行的代码: def loop(): print('thread %s is running...' % threading.current_thread().name) n = 0 while ......

io123
2016/04/01
0
0
Python: 关于thread模块和threading模块的选择

最近在阅读Python核心编程(第二版)。 作者在多线程编程一章讲到thread和threading这两个模块时, 提到要避免使用thread模块,取而代之地使用threading模块。 之后点明了原因—— "更高级别...

mickelfeng
2016/08/05
70
0
python 多线程之threading

一些常用函数: 个人比较喜欢创建线程类来实现多线程来个简单的例子,开2个线程,打印时间,未加锁情况 结果很明显,线程1和线程2同时执行 加锁情况 结果很明显,加锁之后,线程1执行完,线程...

不肥的小肥羊
2016/05/29
55
0
Python线程锁

多线程适用于IO密集型,多线程实现方式有两种,详见下方例子 例子: import threading class MyThread(threading.Thread): def init(self, args): #使用super写法,按照父类.方法的方式直接重...

粗粮面包
2017/12/13
0
0

没有更多内容

加载失败,请刷新页面

加载更多

74.expect脚本同步文件以及指定host同步文件 构建分发系统文件和命令

20.31 expect脚本同步文件: 在expect脚本中去实现在一台机器上把文件同步到另外一台机器上去。核心命令用的是rsync ~1.自动同步文件 #!/usr/bin/expect set passwd "123456" spawn rsync -a...

王鑫linux
19分钟前
0
0
TypeScript项目引用(project references)

转发 TypeScript项目引用(project references) TypeScript新特性之项目引用(project references) 项目引用是TypeScript 3.0中的一项新功能,允许您将TypeScript程序构建为更小的部分。 通过这...

durban
23分钟前
0
0
爬虫入门

导读 网络爬虫(Web crawler),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本,它们被广泛用于互联网搜索引擎或其他类似网站,可以自动采集所有其能够访问到的页面内容,以获取...

问题终结者
23分钟前
0
0
ppwjs之bootstrap文字排版:无序列表项不换行

<!DOCTYPT html><html><head><meta http-equiv="content-type" content="text/html; charset=utf-8" /><title>ppwjs欢迎您</title><link rel="icon" href="/favicon.ico" ......

ppwjs
30分钟前
0
0
SpringBoot 学习一

本文将从以下几个方面介绍: 前言 HelloWorld 读取配置文件 例子(CURD) 前言 Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架...

tsmyk0715
30分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部