线程分为:
内核线程:由操作系统内核创建和撤销
用户线程:不需要内核支持而在用户程序中实现的线程
python3 线程中常用的两个模块:
_thread和threading(推荐使用)
python中使用线程有两种方式:函数或者用类来包装线程对象
函数式:
#调用模块
import _thread
import time
#为线程定义一个函数
def print_time(th,delay):
count = 0
while count < 5:
#延时
time.sleep(delay)
count += 1
#转换时间戳
print("%s:%s"% (th,time.ctime(time.time())))
#创建两个线程
try:
_thread.start_new_thread(print_time,("thread1",2,))
_thread.start_new_thread(print_time,("thread2",4,))
except:
print("无法启动")
#一直循环
while 1:
pass
使用 threading 模块创建线程:
#调用模块
import threading
import time
exitFlag = 0
#声明了个类
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)
print_time(self.name, self.counter, 5)
print ("退出线程:" + self.name)
def print_time(threadName, delay, counter):
while counter:
if exitFlag:
threadName.exit()
time.sleep(delay)
print ("%s: %s" % (threadName, time.ctime(time.time())))
counter -= 1
# 创建新线程
thread1 = myThread(1, "Thread-1", 1)
thread2 = myThread(2, "Thread-2", 2)
# 开启新线程
thread1.start()
thread2.start()
thread1.join()
thread2.join()
print ("退出主线程")
线程同步:
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()
# 添加线程到线程列表
threads.append(thread1)
threads.append(thread2)
# 等待所有线程完成
for t in threads:
t.join()
print ("退出主线程")