semaphore信号量可以通过内置计数器来控制同时运行线程的数量
- 每当调用acquire()时,内置计数器-1,直到为0的时候阻塞
- 每当调用release()时,内置计数器+1,并让某个线程的acquire()从阻塞变为不阻塞
- Semaphore: 在调用release()函数时,不会检查,增加的计数是否超过上限(没有上限,会一直上升)
- BoundedSemaphore: 在调用release()函数时,会检查,增加的计数是否超过上限,这样就保证了使用的计数
Thread :线程类,这是用的最多的一个类,可以指定线程函数执行或者继承自它都可以实现子线程功能。
Lock :原锁,是一个同步原语,当它锁住时不归某个特定的线程所有,这个可以对全局变量互斥时使用。
RLock :可重入锁,使单线程可以再次获得已经获得的锁,即可以被相同的线程获得多次。
Condition :条件变量,能让一个线程停下来,等待其他线程满足某个“条件”。
Event:事件对象,是线程间最简单的通信机制之一:线程可以激活在一个事件对象上等待的其他线程。
Semaphore:信号量对象,是个变量,管理一个内置的计数器,指定可同时访问资源或者进入临界区的线程数。
BoundedSemaphore :有界信号量对象,与semaphore类似,但不允许超过初始值;
ThreadError:线程错误信息类。
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
import requests
import threading
import time
ip = 'xx'
set_ufs = 'xx'
def SetUfs(value, city_id=1):
url = ip + set_ufs
data = {'featureValues': value}
headers = {'Content-Type': 'application/x-www-form-urlencoded'}
result = requests.post(url=url, data=data, headers=headers).json()
return result
def ReadFile(filePath):
driver_id_list = []
with open(filePath, 'r') as f:
contents = f.readlines()
for content in contents:
driver_id = content.split(',')[0]
driver_id_list.append(driver_id)
# yield driver_id_list
return driver_id_list
if __name__ == '__main__':
filepath = 'xxx'
driver_id_list = ReadFile(filepath)
l1 = len(driver_id_list) // 1000
print(l1)
l2 = l1 * 2
l3 = l1 * 998
l4 = l1 * 999
threading_list = []
now = time.strftime('%Y-%m-%d %H:%M:%S')
print(f'start time {now}')
with threading.Semaphore(5) as sem: #设置同时最多5个,使用with语句块,会自动帮你执行acquire()和release()
for driver_id in driver_id_list[l1:l2]:
value2 = "xxx".replace("xx", driver_id)
thread2 = threading.Thread(target=SetUfs, args=(value2,))
threading_list.append(thread2)
for driver_id in driver_id_list[l3:l4]:
value4 = "xxx".replace("xx", driver_id)
value5 = "xxx".replace("xx", driver_id)
thread4 = threading.Thread(target=SetUfs, args=(value4,))
thread5 = threading.Thread(target=SetUfs, args=(value5,))
threading_list.append(thread4)
threading_list.append(thread5)
for i in range(len(threading_list)):
threading_list[i].start()
for i in range(len(threading_list)):
threading_list[i].join()
print(u'全部结束', time.strftime('%Y-%m-%d %H:%M:%S'))