python 多线程两种实现方式

原创 Linux操作系统 作者:杨奇龙 时间:2014-06-08 20:24:26  44021  0
目前python 提供了几种多线程实现方式 thread,threading,multithreading ,其中thread模块比较底层,而threading模块是对thread做了一些包装,可以更加方便的被使用。
2.7版本之前python对线程的支持还不够完善,不能利用多核CPU,但是2.7版本的python中已经考虑改进这点,出现了multithreading  模块。threading模块里面主要是对一些线程的操作对象化,创建Thread的class。一般来说,使用线程有两种模式:
A 创建线程要执行的函数,把这个函数传递进Thread对象里,让它来执行;
B 继承Thread类,创建一个新的class,将要执行的代码 写到run函数里面。

本文介绍两种实现方法。
第一种 创建函数并且传入Thread 对象中
t.py 脚本内容

  1. import threading,time
  2. from time import sleep, ctime
  3. def now() :
  4. return str( time.strftime( '%Y-%m-%d %H:%M:%S' , time.localtime() ) )
  5. def test(nloop, nsec):
  6. print 'start loop', nloop, 'at:', now()
  7. sleep(nsec)
  8. print 'loop', nloop, 'done at:', now()
  9. def main():
  10. print 'starting at:',now()
  11. threadpool=[]
  12. for i in xrange(10):
  13. th = threading.Thread(target= test,args= (i,2))
  14. threadpool.append(th)
  15. for th in threadpool:
  16. th.start()
  17. for th in threadpool :
  18. threading.Thread.join( th )
  19. print 'all Done at:', now()
  20. if __name__ == '__main__':
  21. main()

执行结果:

thclass.py 脚本内容:

  1. import threading ,time
  2. from time import sleep, ctime
  3. def now() :
  4. return str( time.strftime( '%Y-%m-%d %H:%M:%S' , time.localtime() ) )
  5. class myThread (threading.Thread) :
  6. """docstring for myThread"""
  7. def __init__(self, nloop, nsec) :
  8. super(myThread, self).__init__()
  9. self.nloop = nloop
  10. self.nsec = nsec
  11. def run(self):
  12. print 'start loop', self.nloop, 'at:', ctime()
  13. sleep(self.nsec)
  14. print 'loop', self.nloop, 'done at:', ctime()
  15. def main():
  16. thpool=[]
  17. print 'starting at:',now()
  18. for i in xrange(10):
  19. thpool.append(myThread(i,2))
  20. for th in thpool:
  21. th.start()
  22. for th in thpool:
  23. th.join()
  24. print 'all Done at:', now()
  25. if __name__ == '__main__':
  26. main()

执行结果:

 

Python多线程下的_strptime问题

由于Python的datetime和time中的_strptime方法不支持多线程,运行时会报错:

import datetime
import thread
import time

def f():
    datetime.datetime.strptime("20100101","%Y%m%d")

for _ in xrange(3):
    thread.start_new_thread(f, ())
time.sleep(3)

Unhandled exception in thread started by <function f at 0x2b52c24e66e0>
Traceback (most recent call last):
  File "test.py", line 7, in f
    datetime.datetime.strptime("20100101","%Y%m%d")
AttributeErrorUnhandled exception in thread started by <function f at 0x2b52c24e66e0>:
Traceback (most recent call last):
  File "test.py", line 7, in f
_strptime
    datetime.datetime.strptime("20100101","%Y%m%d")
AttributeError: _strptime

参考 http://bugs.python.org/issue7980

在源文件中可以fix这个bug,不过对于用户来说,还是在使用的时候加锁吧。。

c = threading.RLock()
def f():
    with c:
        datetime.datetime.strptime("20100101","%Y%m%d")

python 多线程两种实现方式,Python多线程下的_strptime问题,的更多相关文章

  1. 【Python】python 多线程两种实现方式

    目前python 提供了几种多线程实现方式 thread,threading,multithreading ,其中thread模块比较底层,而threading模块是对thread做了一些包装,可以更 ...

  2. Java多线程--两种实现方式

    进程概述: 在这之前,有必要了解一下什么是进程? 在一个操作系统中,每个独立的执行的程序都可称为一个进程,也就是"正在运行的程序".如图所示: 线程概述: 如上所述,每个运行的程序 ...

  3. 快速排序quick_sort(python的两种实现方式)

    排序算法有很多,目前最好的是quick_sort:unstable,spatial complexity is nlogN. 快速排序原理 python实现 严蔚敏的 datastruct书中有伪代码 ...

  4. Java多线程13:读写锁和两种同步方式的对比

    读写锁ReentrantReadWriteLock概述 大型网站中很重要的一块内容就是数据的读写,ReentrantLock虽然具有完全互斥排他的效果(即同一时间只有一个线程正在执行lock后面的任务 ...

  5. 巨蟒python全栈开发数据库前端6:事件onclick的两种绑定方式&&onblur和onfocus事件&&window.onload解释&&小米商城讲解

    1.回顾上节内容(JavaScript) 一.JavaScript概述 1.ECMAScript和JavaScript的关系 2.ECMAScript的历史 3.JavaScript是一门前后端都可以 ...

  6. python常有模块:模块、引入语法、两种执行方式、模块搜索顺序

    今天主要讲了以下几点:一.模块三问.定义及分类二.import和from的语法三.文件的两种执行方式及搜索顺序四.内置函数 一.模块.import和from的语法 1.什么是模块   模块是一堆功能函 ...

  7. python selenium 三种等待方式详解[转]

    python selenium 三种等待方式详解   引言: 当你觉得你的定位没有问题,但是却直接报了元素不可见,那你就可以考虑是不是因为程序运行太快或者页面加载太慢造成了元素不可见,那就必须要加等待 ...

  8. 【转载】pygame安装与两种版本的Python兼容问题

    在开始学习游戏编程之前,我们先来安装下pygame和python3.2.5 参考园友: http://www.cnblogs.com/hongten/p/hongten_pygame_install. ...

  9. python 的几种启动方式

    python 的几种启动方式 (1)利用Win的操作系统的:命令行工具 cmd.exe Win + R  调出运行对话框,然后输入cmd,即可调出“命令提示符对话框” 或者 在菜单中店家附件中的命令提 ...

随机推荐

  1. 替换^M字符

    关于回车与换行 很久以前,老式的电传打字机使用两个字符来另起新行.一个字符把滑动架移回首位 (称为回车,ASCII码为0D),另一个字符把纸上移一行 (称为换行,ASCII码为0A).当计算机问世以后 ...

  2. 轻松搞定word中让人抓狂的自动编号

    在word中使用自动编号时,如果一级编号是2,想让其后面的二级编号自动编号为2.1.2.2--,三级编号自动编号为2.1.1.2.1.2--:且在该一级编号调整为3时,后面的二级编号和三级编号的第一位 ...

  3. MySQL统计同比环比SQL

    大体思路: MySQL没有类似oracle方便的统计函数,只能靠自己去硬计算:通过时间字段直接增加年份.月份,然后通过left join关联时间字段去计算环比.同比公式即可 原始表结构: 求同比SQL ...

  4. Laravel / PHP 扩展包视频教程

    https://laravel-china.org/courses/laravel-package 每周精选两个以上扩展包进行讲解,涵盖 PHP 和 Laravel 相关的最新.最热.最常用的扩展包. ...

  5. 微博第三方登录时,域名使用错误报错, Laravel \ Socialite \ Two \ InvalidStateException No message

    使用微博第三方登录时,报错 Laravel \ Socialite \ Two \ InvalidStateException No message Laravel \Socialite \Two \ ...

  6. Mybatis/Ibatis,数据库操作的返回值

    该问题,我百度了下,根本没发现什么有价值的文章:还是看源代码(详见最后附录)中的注释,最有效了!insert,返回值是:新插入行的主键(primary key):需要包含<selectKey&g ...

  7. @NOI模拟2017.06.30 - T3@ Right

    目录 @description@ @solution@ @part - 1@ @part - 2@ @accepted code@ @details@ @description@ JOHNKRAM 和 ...

  8. 神经网络为什么需要多次epoch

    Δw(t)=−ε ∂w(t)∂E​ +αΔw(t−1)(9) 我们知道反向传播每次迭代的效果是这样的:w=w+Δw(t) w=w+\Delta w(t)w=w+Δw(t) 我们知道,每条训练数据都会导 ...

  9. 微软产品开发文档:包括.net core .net vs等等

    Browse all https://docs.microsoft.com/en-us/learn/browse/?roles=developer&products=xamarin%2Cef- ...

  10. 2009年NOIP普及组复赛题解

    题目涉及算法: 多项式输出:模拟: 分数线划定:模拟.排序: 细胞分裂:质因数分解: 道路游戏:动态规划. 多项式输出 题目链接:https://www.luogu.org/problem/P1067 ...