2019-05-09 day18多线程总结

每个进程默认有一个主线程,其它的都叫子线程 需要子线程就创建这个类(需要导入threading模块 Thread)的对象

def download(filenames):
    print('开始下载:%s'%filenames,datetime.now())
    time.sleep(3)
    print('%s下载完成'%filenames,datetime.now())

 单线程 在一个线程中下载两个电影 耗时10s
download('阿凡达')
download('阿凡达2')
# threading.current_thread() - 获取当前线程
print(threading.current_thread())

3.Thread类

Thread类的对象就是线程,需要子线程就创建
这个类的对象

Thread(target,args,kwargs)
target - 函数,需要在当前创建的子线程中去调用的函数

args/kwargs - 给target调用的函数传参

# a.创建线程对象
t1 = threading.Thread(target=download,args=('阿凡达',))

t2 = threading.Thread(target=download,args=('008',))
# b.开始执行子线程中的任务
线程对象.start()
通过strat()方法,调用target对应的函数
t1.start(),t2.start()

1.创建自己的线程类

1.声明一个类继承Thread
2.实现run方法,这个方法中的任务就是需要在子线程中执行的任务


class DownloadThread(Thread):
    def __init__(self,filesname):
        super().__init__()
        self.filename=filesname

    def run(self):
        print('开始下载:%s'%self.filename,datetime.now())
        time.sleep(3)
        print('%s下载完成'%self.filename,datetime.now())


t1 = DownloadThread('复联4')
t2 = DownloadThread('长江')
t2.start()
t1.start() # 在子线程中执行
# t1.run() # 对象方法,可以调用,但是在主线程中执行,创建子线程对象就没有意义了
如果一个进程中有多个线程,程序会在所有的线程都结束
后才结束  
发生异常崩溃的是线程,而不是进程
t2=DownT('盗梦空间')
t3=DownT('恐怖游轮')
t2.start()

线程对象.join()
如果希望第二个线程在第一个线程结束后才执行,就把第二个线程
放在第一个线程对象.join()后面
t2.join()
t3.start()
t3.join()
print('ok')

锁的使用:

1.问题
当多个线程同时对一个数据进行读写操作,可能会出现一个线程刚把数据读出来还没来得及写进去,另外一个线程进行读操作的数据安全问题。
(多个人上一个厕所,一个人进去了还没出来,另外一个人又进去的问题)
2.解决 - 加锁
1)保证每个数据对应一个锁对象
2)操作数据前加锁,数据操作完成后释放锁
share_data = 1000
lock = Lock()


def add_data(value):
    lock.acquire()
    global share_data
    old_data = share_data
    time.sleep(4)
    share_data = old_data + value
    lock.release()

t1 = Thread(target=add_data, args=(200,))
t2 = Thread(target=add_data, args=(300,))
t1.start()
t2.start()

t1.join()
t2.join()

print(share_data)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容