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. OKhttp基本使用介绍

    MainActivity.class package com.example.administrator.okhttp3; import android.support.v7.app.AppCompa ...

  2. 【leetcode】 search Insert Position(middle)

    Given a sorted array and a target value, return the index if the target is found. If not, return the ...

  3. MAC系统下,删除.svn文件

    MAC系统下,.svn文件是隐藏的. 如果项目是非export导出的,那么项目中会有很多的.svn文件. 如果项目的体积非常庞大,我们如何快速的批量删除.svn文件呢?下面是操作方法: 打开终端,cd ...

  4. mongodb3.x用户角色

    用户和角色是多对多的关系,一个用户可以对应多个角色,一个角色可以拥有多个用户.用户角色的不同对应的权限也是不一样的.下面是一些分配给用户的常见的角色. read                    ...

  5. 移动端hrml模板

    <!DOCTYPE html><html><head> <title>时钟</title> <meta charset="u ...

  6. 转载_虚拟机下LInux(终端)配置网络的方法

    出自: http://www.360doc.com/content/14/1027/11/17496895_420258403.shtml 对文章的重点进行剪贴,方便查看. 这几天在虚拟机vmware ...

  7. Java——Cookie与Session

    Cookie通过客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份. 1.Cookie  1.1概念及使用方法 Cookie实际上是一小段文本信息.客户端请求服务器,如果服务 ...

  8. 直接放个DB2 SQL STATEMENT大全好了!

    SQL statements   This topic contains tables that list the SQL statements classified by type. SQL sch ...

  9. sys.sysprocesses视图的使用小结

    Sys.SysProcesses 系统表是一个很重要的系统视图,主要用来定位与解决Sql Server的阻塞和死锁包含正在 SQL Server 实例上运行的进程的相关信息.这些进程可以是客户端进程或 ...

  10. Spring中的jar包详解

    下面给大家说说spring众多jar包的特点吧,无论对于初学spring的新手,还是spring高手,这篇文章都会给大家带来知识上的收获,如果你已经十分熟悉本文内容就当做一次温故知新吧.spring. ...