zoukankan      html  css  js  c++  java
  • _thread模块

    #Python中调用_thread模块中的start_new_thread()函数产生新线程。_thread的语法如下:
    1 _thread.start_new._thread(function,args[,kwargs])
    #其中,function为线程函数:args为传递给线程函数的参数,必须是tuple类型;kwargs为可选参数。
    #_thread模块除了产生线程外,还提供基本同步数据结构锁对象(lock object,也叫原语锁、简单锁、互斥锁、互斥量、二值信号量)。同步原语与线程管理是密不可分的。
    #我们来看如下示例:
     1 #!/usr/bin/python3
     2 #-*-coding:UTF-8-*-
     3 #_thread
     4 
     5 import _thread
     6 from time import sleep
     7 from datetime import datetime
     8 
     9 
    10 date_time_format='%y-%M-%d %H:%M:%S'
    11 
    12 def date_time_str(date_time):
    13     return datetime.strftime(date_time,date_time_format)
    14 
    15 def loop_one():
    16     print('+++线程一开始于:',date_time_str(datetime.now()))
    17     print('+++线程一休眠4秒')
    18     sleep(4)
    19     print('+++线程一休眠结束,结束于:',date_time_str(datetime.now()))
    20 
    21 def loop_two():
    22     print('***线程二开始于:',date_time_str(datetime.now()))
    23     print('***线程二休眠2秒')
    24     sleep(2)
    25     print('***线程二结束休眠,结束于:',date_time_str(datetime.now()))
    26 
    27 def main():
    28     print('-----所有线程开始时间:',date_time_str(datetime.now()))
    29     _thread.start_new_thread(loop_one,())
    30     _thread.start_new_thread(loop_two,())
    31     sleep(6)
    32     print('-----所有线程结束时间:',date_time_str(datetime.now()))
    33 
    34 if __name__=='__main__':
    35     main()
    #执行结果如下:
    1 D:Pythonworkspacedatatime20180123>python _thread.py
    2 -----所有线程开始时间: 18-01-23 21:01:22
    3 ***线程二开始于: 18-01-23 21:01:22
    4 +++线程一开始于: 18-01-23 21:01:22
    5 ***线程二休眠2秒
    6 +++线程一休眠4秒
    7 ***线程二结束休眠,结束于: 18-01-23 21:01:24
    8 +++线程一休眠结束,结束于: 18-01-23 21:01:26
    9 -----所有线程结束时间: 18-01-23 21:01:28
    #_thread模块提供了简单的多线程机制,两个循环并发执行,总的运行时间为最慢的线程的运行时间(主线程6s),而不是所有线程的运行时间之和。start_new_thread()要求至少传两个参数,即使想要运行的函数不要参数,也要传一个空元组。
    #sleep(6)是让主线程停下来。主线程一旦运行结束,就关闭运行着的其他两个线程。这可能造成主线程过早或过晚退出,这时就要使用线程锁,主线程可认在两个子线程都退出后立即退出。
    #示例代码如下:
     1 #!/usr/bin/python3
     2 #-*-coding:UTF-8-*-
     3 #_thread
     4 
     5 import _thread
     6 from time import sleep
     7 from datetime import datetime
     8 
     9 loops=[4,2]
    10 date_time_format='%y-%M-%d %H:%M:%S'
    11 
    12 def date_time_str(date_time):
    13     return datetime.strftime(date_time,date_time_format)
    14 
    15 def loop(n_loop,n_sec,lock):
    16     print('线程(',n_loop,')开始执行:,date_time_str(datetime.now()),先休眠(',n_sec,')秒')
    17     sleep(n_sec)
    18     print('线程(',n_loop,')休眠结束,结束于:',date_time_str(datetime.now()))
    19     lock.release()
    20 
    21 def main():
    22     print('---所有线程开始执行...')
    23     locks=[]
    24     n_loops=range(len(loops))
    25 
    26     for i in n_loops:
    27         lock=_thread.allocate_lock()
    28         lock.acquire()
    29         locks.append(lock)
    30 
    31     for i in n_loops:
    32         _thread.start_new_thread(loop,(i,loops[i],locks[i]))
    33 
    34     for i in n_loops:
    35         while locks[i].locked():
    36             pass
    37 
    38     print('---所有线程执行结束:',date_time_str(datetime.now()))
    39 
    40 if __name__=='__main__':
    41     main()
    #执行结果如下:
    1 D:Pythonworkspacedatatime20180123>python _thread.py
    2 ---所有线程开始执行...
    3 线程( 0 )开始执行:,date_time_str(datetime.now()),先休眠( 4 )秒
    4 线程( 1 )开始执行:,date_time_str(datetime.now()),先休眠( 2 )秒
    5 线程( 1 )休眠结束,结束于: 18-02-23 23:02:30
    6 线程( 0 )休眠结束,结束于: 18-02-23 23:02:32
    7 ---所有线程执行结束: 18-02-23 23:02:32
    #可以看到,以上代码使用了线程锁。
  • 相关阅读:
    数据结构2
    EF Fluent API
    VS2017+mysql5.7 连接数据库生成实体
    JavaScript中的枚举
    EasyUI datagird 排序 按数字类型的问题
    php 将秒数转换为时间(年、天、小时、分、秒)
    mySQL把秒转换成日期
    Android 界面间传参数
    android 登陆界面
    Android 在已有的项目上创建新的项目
  • 原文地址:https://www.cnblogs.com/DLHe/p/8403389.html
Copyright © 2011-2022 走看看