线程和进程的区别
#本文部分参考www.runoob.com
问题起因:
在用tkinter开发界面时,如何加一个进度条,显示用户某一操作完成的进度?(这可能是Android开发比较常见的一个功能)
如一个是operate()执行用户操作,一个是precess()维护进度条,这两个任务如何同时进行?
这就需要用到多线程
简单介绍: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结束
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
退出主线程