多线程

多线程

多线程的简单应用–可用于网络爬虫爬取分段的视频文件

阻塞进程:等待子进程全部结束在运行主进程

__Author__ = ‘Jiudan’
import random
import threading
import time

# 模拟执行任务的函数
def run(n):
print(‘task {} 开始’.format(n))
time.sleep(2 + random.randint(1, 3)) # 模拟线程运行
print(‘task {} done 线程编号:{} 线程数量: {}’.format(n, threading.current_thread(), threading.active_count()))

t_ob = []
for i in range(1, 6): # 开启五个进程
t = threading.Thread(target=run, args=(‘a{}’.format(i),)) # 注意这里的函数运行方式及传参(元组形式)
t_ob.append(t) # 将线程加入到列表
t.start() # 启动线程

for t in t_ob:
t.join() # 阻塞进程,等待子进程全部结束才继续进行主进程

# 主线程
print(‘主线程: {} 结束 数量: {}’.format(threading.current_thread(), threading.active_count()))

守护进程:主线程结束即结束所有子进程

__Author__ = ‘Jiudan’
import random
import threading
import time

# 模拟执行任务的函数
def run(n):
print(‘task {} 开始’.format(n))
time.sleep(2 + random.randint(1, 3)) # 模拟线程运行
print(‘task {} done 线程编号:{} 线程数量: {}’.format(n, threading.current_thread(), threading.active_count()))

for i in range(1, 6): # 开启五个进程
t = threading.Thread(target=run, args=(‘a{}’.format(i),)) # 注意这里的函数运行方式及传参(元组形式)
t.setDaemon(True) # 守护线程,主进程结束即结束所有字进程
t.start() # 启动线程

# 主线程

GIL锁:防止数据同时被多个线程修改

__Author__ = ‘Jiudan’
import threading
import time
import random
num = 0

def run(n):
global num
# 模拟时长
time.sleep(random.randint(1, 3))
# 获取锁
Lock.acquire()
# 修改 num 的数据(意为未修改完成则不释放锁,在获取锁的同时,其他线程不能启动修改数据,以防止数据被两个线程同时修改)
num += 1
if num <= 50:
print(‘当前已修改为:{}’.format(num))
# 释放锁
Lock.release()
else:
print(‘当前进程 {} 未释放锁–其他线程不得执行–线程数量:{}’.format(threading.current_thread(), threading.active_count()))

# 创建锁的实例
Lock = threading.Lock()

for i in range(1, 101): # 开启100个进程
t = threading.Thread(target=run, args=(‘a{}’.format(i),))
t.start()

设置信号量

__Author__ = ‘Jiudan’

import random
import threading
import time

def run(n):
semaphore.acquire() # 获取锁
time.sleep(random.uniform(2, 4))
print(‘task {}’.format(n))
if n <= 50:
semaphore.release()

semaphore = threading.BoundedSemaphore(5) # 信号量,同时开启5个线程(线程结束即开启新的线程,保证时刻有五个线程在运行)
for i in range(1, 100): # 开启100个进程
t = threading.Thread(target=run, args=(i,))
t.start()