import threading
from time import sleep
from datetime import datetime
# 1.主线程和子线程
'''
默认情况下,进程有一个线程,这个线程叫主线程。(主线程是系统自动创建的)
默认程序所有的代码是在主线程下执行的
程序员通过代码创建的线程都叫子线程。
'''
# 2.创建子线程
'''
python内置的threading模块中提供了和线程操作相关的类和方法
threading模块中有个Thread类,这个或者这个的子类的对象就是线程对象
需要子线程的时候就创建Thread类的对象
'''
def download(name):
print('%s: 开始下载:%s' % (datetime.now(), name))
print(threading.current_thread())
sleep(5)
print('%s: 下载完成:%s' % (datetime.now(), name))
if __name__ == '__main__':
# download('龙猫')
# 1.创建线程对象
'''
1)语法
Thread(target=函数, args=实参列表)
2)说明
target - 必须要赋一个函数,这个函数会在子线程中调用
args - 赋一个元组,元组中的元素就是调用target函数的时候需要传的参数
'''
# 1.创建两个子线程对象
t1 = threading.Thread(target=download, args=('龙猫',))
t2 = threading.Thread(target=download, args=('你的名字',))
# 2.让子线程开始执行
'''
线程对象.start() - 在子线程中去调用target对应函数,并将args中的值作为实参
'''
t1.start()
t2.start()
# 3.程序的结束(进程的结束)
'''
一个进程的结束,看是否这个进程中的每个线程都结束。
线程结束:任务执行完成,遇到exit()函数,发生异常
程序出现异常只会影响当前出现异常的线程,其他线程正常运行
exit()只结束当前的线程
'''
1.通过创建Thread类的子类对象来创建子线程
1)声明一个类继承Thread
class DownloadThread(threading.Thread):
def __init__(self, name):
super().__init__()
self.name = name
# 2)实现run方法,这个方法中代码就是会在子线程中执行的代码
def run(self):
print('%s - 开始下载:%s ' % (datetime.now(), self.name))
sleep(4)
# print(threading.current_thread())
print('%s - 下载完成:%s' % (datetime.now(), self.name))
if __name__ == '__main__':
# 3)创建子类的线程对象
t1 = DownloadThread('龙猫',)
# 4)通过start去执行子线程中的任务
t1.start()
import threading
import datetime
import time
import random
class Download(threading.Thread):
def __init__(self, name):
super().__init__()
self.name = name
def run(self):
print('%s - 开始下载%s' % (datetime.datetime.now(), self.name))
t = random.randint(2, 6)
time.sleep(t)
print('%s - %s下载完成' % (datetime.datetime.now(), self.name))
if __name__ == '__main__':
t1 = Download('龙猫')
t2 = Download('你的名字')
t3 = Download('女教师')
t1.start()
t2.start()
# 1.join的用法
'''
线程对象.join()
其他的代码
其他代码会等到指定的线程对象结束后才会执行
'''
t1.join()
t2.join()
t3.start()
print('下载完成')
import threading
import time
# 1.怎么加锁
'''
1)保证一个数据对应一把锁:创建锁对象
2)使用数据前加锁:锁对象.acquire()
3)数据使用完成后释放锁
'''
account = 1000
# 1.创建锁对象
lock = threading.Lock()
def save_money(num):
# 2.加锁
lock.acquire()
print('开始存钱')
global account
balance = account
time.sleep(4)
account = balance + num
# 3.释放锁
lock.release()
print('存完后余额:%d' % account)
def draw_money(num):
lock.acquire()
print('开始取钱')
global account
balance = account
if balance < num:
print('余额不足...')
return
time.sleep(4)
account = balance - num
lock.release()
print('取完后余额:%d' % account)
t1 = threading.Thread(target=save_money, args=(1000,))
t2 = threading.Thread(target=draw_money, args=(500,))
t1.start()
t2.start()
import threading
import time
class Account:
def __init__(self, name, id_card, tel, balance):
self.balance = balance
self.name = name
self.id_card = id_card
self.card_number = '2221'
self.tel = tel
self.lock = threading.Lock()
def save_money(self, num):
# lock.acquire()
print('开始存钱')
self.lock.acquire()
balance = self.balance
time.sleep(4)
self.balance = balance + num
# 3.释放锁
# lock.release()
print('存完后余额:%d' % self.balance)
self.lock.release()
def draw_money(self, num):
# lock.acquire()
print('开始取钱')
self.lock.acquire()
balance = self.balance
if balance < num:
print('余额不足')
time.sleep(4)
self.balance = balance - num
# 3.释放锁
# lock.release()
print('取完后余额:%d' % self.balance)
self.lock.release()
account = Account('zzq', '231', '213', 100)
account2 = ('21e', '421', '213', 100)
t1 = threading.Thread(target=account.save_money, args=(100,))
t2 = threading.Thread(target=account.draw_money, args=(50,))
t1.start()
t2.start()