python3进阶高级_python_高级进阶(3)线程

线程

进程只是用来把资源集中到一起(进程只是一个资源单位),

而线程才是cpu上的执行单位。

线程的好处

开启进程的开销非常大,比开启线程的开销大很多.

开启线程的速度非常快.要快几十倍到上百倍.

线程线程之间可以共享数据,进程与进程之间需借助队列等方法实现通信.

线程的应用

该进程肯定需要办不止一件事情,比如监听键盘输入,处理文字,

定时自动将文字保存到硬盘,这三个任务操作的都是同一块数据,

因而不能用多进程。只能在一个进程里并发地开启三个线程,如果是单线程,

那就只能是,键盘输入时,不能处理文字和自动保存,自动保存时又不能输入和处理文字。

开启线程两种方式

方式一

# 第一种方式

# from threading import Thread

# import time

#

# def task(name):

# print(f'{name} is running')

# time.sleep(1)

# print(f'{name} is gone')

#

#

#

# if __name__ == '__main__':

#

# t1 = Thread(target=task,args=('A',))

# t1.start()

# print('===主线程') # 线程是没有主次之分的.

方式二

from threading import Thread

# import time

#

# class MyThread(Thread):

#

# def __init__(self,name,l1,s1):

# super().__init__()

# self.name = name

# self.l1 = l1

# self.s1 = s1

# def run(self):

# print(f'{self.name} is running')

# time.sleep(1)

# print(f'{self.name} is gone')

#

# if __name__ == '__main__':

# t1 = MyThread('B', [1,2,3], '180')

# t1.start()

# print('=====主线程')

多线程与多进程开启速度区别.

多进程:

from threading import Thread

# from multiprocessing import Process

# import os

#

# def work():

# print('hello')

#

# if __name__ == '__main__':

# #在主进程下开启线程

# t=Process(target=work)

# t.start()

# print('主线程/主进程')

多线程

from threading import Thread

# import time

#

# def task(name):

# print(f'{name} is running')

# time.sleep(1)

# print(f'{name} is gone')

#

#

#

# if __name__ == '__main__':

#

# t1 = Thread(target=task,args=('海狗',))

# t1.start()

# print('===主线程') # 线程是没有主次之分的.

线程进程

多进程:

# from multiprocessing import Process

# import time

# import os

# def task(name):

# print(f'子进程: {os.getpid()}')

# print(f'主进程: {os.getppid()}')

#

#

# if __name__ == '__main__':

#

# p1 = Process(target=task,args=('A',)) # 创建一个进程对象

# p2 = Process(target=task,args=('A',)) # 创建一个进程对象

# p1.start()

# p2.start()

# print(f'==主{os.getpid()}')

多线程

from threading import Thread

import os

def task():

print(os.getpid())

if __name__ == '__main__':

t1 = Thread(target=task)

t2 = Thread(target=task)

t1.start()

t2.start()

print(f'===主线程{os.getpid()}')

同一个进程内线程共享内部数据

# from threading import Thread

# import os

#

# x = 3

# def task():

# global x

# x = 100

#

# if __name__ == '__main__':

#

# t1 = Thread(target=task)

# t1.start()

# t1.join()

# print(f'===主线程{x}')

# 同一进程内的资源数据对于这个进程的多个线程来说是共享的.

线程的相关其他方法

from threading import Thread

from threading import currentThread

from threading import enumerate

from threading import active_count

import os,time

x=3

def task():

time.sleep(1)

print('123456')

if __name__=="__main__":

t1=Thread(target=task,name='线程1')

t2= Thread(target=task, name='线程2')

t1.start()

t2.start()

# time.sleep(2)

# print(t1.isAlive())#判断t1线程是否活着

# print(t1.getName())#获取t1线程名字

# t1.setName('子线程1')#修改名字

# print(t1.name)#获取线程名字

#threading方法

print(currentThread())#获取当前线程的对象

print(enumerate())#返回一个列表包含所有线程的对象

print(active_count())#获取线程数

print(f'++++主线程{os.getpid()}')

互斥锁程

from threading import Thread

# import time

# import random

# x = 100

#

# def task():

# time.sleep(random.randint(1,2))

# global x

# temp = x

# time.sleep(random.randint(1, 3))

# temp = temp - 1

# x = temp

#

#

# if __name__ == '__main__':

# l1 = []

# for i in range(100):

# t = Thread(target=task)

# l1.append(t)

# t.start()

#

# for i in l1:

# i.join()

# print(f'主线程{x}')

# 多个任务公抢一个数据,保证数据的安全的目的,要让其串行

from threading import Thread

from threading import Lock

import time

import random

x = 100

def task(lock):

lock.acquire()

# time.sleep(random.randint(1,2))

global x

temp = x

time.sleep(0.01)

temp = temp - 1

x = temp

lock.release()

if __name__ == '__main__':

mutex = Lock()

l1 = []

for i in range(100):

t = Thread(target=task,args=(mutex,))

l1.append(t)

t.start()

time.sleep(3)

print(f'主线程{x}')

守护线程

join: 阻塞 告知主线程要等待我子线程执行完毕之后再执行主线程

# from threading import Thread

# import time

#

# def task(name):

# print(f'{name} is running')

# time.sleep(1)

# print(f'{name} is gone')

#

#

#

# if __name__ == '__main__':

# start_time = time.time()

# t1 = Thread(target=task,args=('海狗',))

# t2 = Thread(target=task,args=('海狗1',))

# t3 = Thread(target=task,args=('海狗2',))

#

# t1.start()

# t1.join()

# t2.start()

# t2.join()

# t3.start()

# t3.join()

#

# print(f'===主线程{time.time() - start_time}') # 线程是没有主次之分的.

# 守护线程

# 回忆一下守护进程

# from multiprocessing import Process

# import time

#

#

# def foo():

# print(123)

# time.sleep(1)

# print("end123")

#

#

# def bar():

# print(456)

# time.sleep(2)

# print("end456")

#

# if __name__ == '__main__':

#

# p1 = Process(target=foo,)

# p2 = Process(target=bar,)

#

# p1.daemon = True

# p1.start()

# p2.start()

# print('====主')

# 守护线程

# from threading import Thread

# import time

#

#

# def sayhi(name):

# print('你滚!')

# time.sleep(2)

# print('%s say hello' %name)

#

# if __name__ == '__main__':

# t = Thread(target=sayhi,args=('egon',))

# # t.setDaemon(True) #必须在t.start()之前设置

# t.daemon = True

# t.start() # 线程的开启速度要跟进程开很多

#

# print('主线程')

# from threading import Thread

# import time

#

# def foo():

# print(123) # 1

# time.sleep(1)

# print("end123") # 4

#

# def bar():

# print(456) # 2

# time.sleep(3)

# print("end456") # 5

#

#

# t1=Thread(target=foo)

# t2=Thread(target=bar)

#

# t1.daemon=True

# t1.start()

# t2.start()

# print("main-------") # 3

# 主线程什么时候结束???

# 守护线程 等待非守护子线程以及主线程结束之后,结束.

# from threading import Thread

# import time

#

# def foo():

# print(123) # 1

# time.sleep(3)

# print("end123") # 4

#

# def bar():

# print(456) # 2

# time.sleep(1)

# print("end456") # 5

#

#

# t1=Thread(target=foo)

# t2=Thread(target=bar)

#

# t1.daemon=True

# t1.start()

# t2.start()

# print("main-------") # 3

'''

123

456

main-------

end123

end456

'''

# from threading import Thread

# import time

#

# def foo():

# print(123)

# time.sleep(3)

# print("end123")

#

# def bar():

# print(456)

# time.sleep(1)

# print("end456")

#

#

# t1=Thread(target=foo)

# t2=Thread(target=bar)

#

# t1.daemon=True

# t1.start()

# t2.start()

# print("main-------")

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值