详解python多线程的原理和实现

    xiaoxiao2025-12-07  10

    详解python多线程的原理和实现

    线程和进程的区别 #本文部分参考www.runoob.com

    问题起因: 在用tkinter开发界面时,如何加一个进度条,显示用户某一操作完成的进度?(这可能是Android开发比较常见的一个功能) 如一个是operate()执行用户操作,一个是precess()维护进度条,这两个任务如何同时进行? 这就需要用到多线程

    python线程库

    简单介绍:python2是’thread’,为了兼容,python3更名为’_thread’,同时python3还提供了更高级的线程管理库’threading’,推荐使用后者

    import threading T = threading.Thread( target = xxx, args = (x1, x2, )) 创建一个新线程,target是执行的函数,args是传入的参数 下面展示两个线程运行的情况

    import threading, time def print_time(threadName, delay): # 测试函数 count = 0 while count < 5: time.sleep(delay) count += 1 print ("%s: %s" % ( threadName, time.ctime(time.time()) )) # 打印当前时间 #线程t1每执行一次休息2s t1 = threading.Thread( target = print_time, args = ("Thread-1", 2, ) ) #线程t2每执行一次休息4s t2 = threading.Thread( target = print_time, args = ("Thread-2", 4, ) ) #一定要用starth()运行线程 t1.start() t2.start()

    运行结果如下:

    # 线程1运行 # 线程2运行 Thread-1: Mon May 27 00:28:50 2019 Thread-2: Mon May 27 00:28:52 2019 Thread-1: Mon May 27 00:28:52 2019 Thread-1: Mon May 27 00:28:54 2019 Thread-2: Mon May 27 00:28:56 2019 Thread-1: Mon May 27 00:28:56 2019 Thread-1: Mon May 27 00:28:58 2019 # 线程1结束 Thread-2: Mon May 27 00:29:00 2019 Thread-2: Mon May 27 00:29:04 2019 Thread-2: Mon May 27 00:29:08 2019 # 线程2结束 观察上述结果发现,t1和t2线程互不干扰,唯一的影响是t1执行完第一次后sleep了2s才开始执行第1次t2(若没有sleep,理论上应该同时执行不分先后);后面每个线程分别隔2s和 4s执行一次。

    创建一个线程类

    import threading class myThread (threading.Thread): # 继承theading的__init__方法 def __init__(self, threadID, name, counter): threading.Thread.__init__(self) self.threadID = threadID self.name = name self.counter = counter def run(self): print ("开始线程:" + self.name) # function() print ("退出线程:" + self.name) #下面可以通过myThread()来创建一个新线程

    线程同步

    如果多个线程同时修改某个数据,可能导致不可预料的后果(如数据库操作中的脏读),这就要求实现一种锁,当线程A执行时,给其他线程添加一个锁以防止某些行为的发生。

    lock = threading.Lock() 创建锁 lock.acquire() 加锁 lock.release() 开锁

    #!/usr/bin/python3 import threading import time class myThread (threading.Thread): def __init__(self, threadID, name, counter): threading.Thread.__init__(self) self.threadID = threadID self.name = name self.counter = counter def run(self): print ("开启线程: " + self.name) # 获取锁,用于线程同步 threadLock.acquire() print_time(self.name, self.counter, 3) # 释放锁,开启下一个线程 threadLock.release() def print_time(threadName, delay, counter): while counter: time.sleep(delay) print ("%s: %s" % (threadName, time.ctime(time.time()))) counter -= 1 threadLock = threading.Lock() threads = [] # 创建新线程 thread1 = myThread(1, "Thread-1", 1) thread2 = myThread(2, "Thread-2", 2) # 开启新线程 thread1.start() thread2.start()

    结果如下所示:

    开启线程: Thread-1 开启线程: Thread-2 Thread-1: Wed Apr 6 11:52:57 2016 Thread-1: Wed Apr 6 11:52:58 2016 Thread-1: Wed Apr 6 11:52:59 2016 Thread-2: Wed Apr 6 11:53:01 2016 Thread-2: Wed Apr 6 11:53:03 2016 Thread-2: Wed Apr 6 11:53:05 2016 退出主线程
    最新回复(0)