python 线程之_thread

_thread module:

基本用法:

 def child(tid):
print("hello from child",tid)
_thread.start_new_thread(child,(1,)

1 使用_thread.start_new_thread() 方法来开始一个新的线程。这个调用接收一个函数对象(或其他可调用对象)和一个参数元组。这非常类似与python的function(*args)调用语法

类似的也可以接受一个关键字参数字典。

2 从操作的角度来说_thread.start_new_thread()的调用本身返回一个没有用的值。在函数调用结束后退住,如果在函数的调用过程中发生了异常会打印堆栈跟踪记录其他部分继续运     行。

3. 使用_thread启动线程的其他方法:

 import _thread

 def action(i):
print(i ** 32) class Power:
def __init__(self,i):
self.i = i
def action(self):
print(self.i ** 32) _thread.start_new_thread(action,(2,)) _thread.start_new_thread(lambda:action(2), ()) obj = Power()
_thread.start_new_thread(obj.action,())

运行多个线程及同步访问共享对象:

在多个线程运行的过程中,如果涉及到一个线程访问修改了一个全局作用域变量,那么这个改变对于此进程中的其他线程是可见的。

好处:使程序的线程间传递信息很简单,所谓的自带任务间通信机制。

坏处:需要注意数个线程同时改变全局对象和名称。如果有两个线程一起改变某个共享的对象,那么可能丢失一个或者共享对象的状态被损坏。

使用锁的概念可以确保在任何一个时间点只有一个线程持有锁。如果在持有期间其他线程请求获得锁,那么这个请求会被一直阻塞,直到释放此锁。

1. 使用_thread.allocate_lock创建一个锁对象可又多个线程轮流获取和释放

 import _thread
import time def counter(threadid, count):
for i in range(count):
time.sleep(1)
mutex.acquire()
print('thread id [{0}] => {1}'.format(threadid, i))
mutex.release()
for i in range(5):
_thread.start_new_thread(counter, (i, 5)) mutex = _thread.allocate_lock() time.sleep(7)
print('main process exit')

2. 在上面的代码中,主线程为了等待所有的子线程完成后在退出使用time.sleep(7)这样的方式,可以使用等待线程退出的其他方式来更灵活的等待。

1. 针对每一个线程创建相应的锁对象,形成锁列表,在线程函数运行之后,获取这个锁对象,在主线程对这个列表进行循环判断。如果所有的锁都是获取状态那么主线程可以退出,反之需要等待所有线程完成之后退出。

 import _thread
import time count = 5
mutex = _thread.allocate_lock()
exitmutexs = [_thread.allocate_lock() for i in range(count)] def child(threadid,count):
for i in range(count):
time.sleep(1)
mutex.acquire()
print('[{0}] => {1}'.format(threadid, i))
mutex.release()
exitmutexs[threadid].acquire() for i in range(count):
_thread.start_new_thread(child, (i, 5)) for m in exitmutexs:
while not m.locked(): pass print('main thread exiting')

2. 上面的代码有点大财效用,通过检查锁的locked方法来查看状态。但是主线程仅仅关注所有的锁被获取,其实可以简单使用包含列表而非锁的方式来达到相同的效果

 import _thread
import time threadNum = 5
mutex = _thread.allocate_lock()
#使用bool的标识列表来判断
exitmutexex = [False] * threadNum def counter(threadid, count):
for i in range(count):
time.sleep(1)
mutex.acquire()
print('[{0}] => {1}'.format(threadid, i))
mutex.release()
exitmutexex[threadid] = True #向主线程发出信号 for i in range(threadNum):
_thread.start_new_thread(counter, (i, 5)) while False in exitmutexex:pass #判断所有线程是否完成
print('main process existing')

3. 在上面的两个脚本存在的问题,I 主线程在繁忙等待中切换,这样在紧凑的程序可能导致显著的性能下降。这个可以使用time.sleep()替换pass

II 使用with语句可以获取锁然后在执行完成之后自动释放锁。

 import _thread
import time threadNum = 5
mutex = _thread.allocate_lock()
exitmutexes = [_thread.allocate_lock() for i in range(5)] def counter(threadid, count):
for i in range(count):
time.sleep(1)
with mutex:
print('[{0}] => {1}'.format(threadid, i))
exitmutexes[threadid].acquire() for i in range(threadNum):
_thread.start_new_thread(counter,(i, 5)) while not all(m.locked() for m in exitmutexes): time.sleep(0.25)
print('main process existing')

python 线程之_thread的更多相关文章

  1. python 线程之 threading(四)

    python 线程之 threading(三) http://www.cnblogs.com/someoneHan/p/6213100.html中对Event做了简单的介绍. 但是如果线程打算一遍一遍 ...

  2. python 线程之 threading(三)

    python 线程之 threading(一)http://www.cnblogs.com/someoneHan/p/6204640.html python 线程之 threading(二)http: ...

  3. python 线程之 threading(一)

    threading:基于对象和类的较高层面上的接口,threading模块在内部使用_thread模块来实现线程的对象以及常用的同步化工具的功能. 使用定制类的方式继承 threading.Threa ...

  4. python 线程之threading(五)

    在学习了Event和Condition两个线程同步工具之后还有一个我认为比较鸡肋的工具 semaphores 1. 使用semaphores的使用效果和Condition的notify方法的效果基本相 ...

  5. python 线程之 threading(二)

    在http://www.cnblogs.com/someoneHan/p/6204640.html 线程一中对threading线程的开启调用做了简单的介绍 1 在线程开始之后,线程开始独立的运行直到 ...

  6. python线程之condition

    cond = threading.Condition() # 类似lock.acquire() cond.acquire() # 类似lock.release() cond.release() # 等 ...

  7. python 多线程编程之_thread模块

    参考书籍:python核心编程 _thread模块除了可以派生线程外,还提供了基本的同步数据结构,又称为锁对象(lock object,也叫原语锁.简单锁.互斥锁.互斥和二进制信号量). 下面是常用的 ...

  8. iOS多线程之8.NSOPeration的其他用法

      本文主要对NSOPeration的一些重点属性和方法做出介绍,以便大家可以更好的使用NSOPeration. 1.添加依赖 - (void)addDependency:(NSOperation * ...

  9. Java多线程之ConcurrentSkipListMap深入分析(转)

    Java多线程之ConcurrentSkipListMap深入分析   一.前言 concurrentHashMap与ConcurrentSkipListMap性能测试 在4线程1.6万数据的条件下, ...

随机推荐

  1. linux查看系统版本和系统位数

    1. uname -a you will view  kernel name.network node hostname.kernel release.kernel version.machine h ...

  2. 【mongo】Can't take a write lock while out of disk space错误

    今天遇到了这个错误,各种无法操作.找了很久的方案,都没用.最终发现,原来是我虚拟机硬盘满了......清除了些没用的东西,就恢复了.

  3. 利用jquery和flash实现复制文字功能(等同于ctrl+c)

    <script type="text/javascript" src="/js/jquery-1.10.2.min.js"></script& ...

  4. sqlserver 解析Json字符串

    转自:https://www.simple-talk.com/sql/t-sql-programming/consuming-json-strings-in-sql-server/ http://ww ...

  5. August 13th 2016 Week 33rd Saturday

    What makes life dreary is the want of motive. 没有目标与动力,生活便会郁闷无光. Without dreams and hope, there will ...

  6. object实现小老鼠交互

    直接使用 <p style="text-align: center; "> <object type="application/x-shockwave- ...

  7. pmap

    .[root@localhost security]# pmap -d : -bash Address Kbytes Mode Offset Device Mapping r-x-- : bash b ...

  8. App Store审核被拒的23个理由

    原文地址 iOS 应用提交审核要持续一周或者更久,在提交之前,我们一定要进行「自我审查」,避免被拒.ASO100 为大家收集整理了2015年 App Store 审核被拒的23个理由,并且附上官方拒绝 ...

  9. STL_advance distance prev next

    template<class InputIterator> typename iterator_traits<InputIterator>::difference_type d ...

  10. UVA 10192 Vacation

    裸最长公共子序列 #include<time.h> #include <cstdio> #include <iostream> #include<algori ...