python高并发-semaphore

semaphore信号量可以通过内置计数器来控制同时运行线程的数量

  1. 每当调用acquire()时,内置计数器-1,直到为0的时候阻塞
  2. 每当调用release()时,内置计数器+1,并让某个线程的acquire()从阻塞变为不阻塞
  3. Semaphore: 在调用release()函数时,不会检查,增加的计数是否超过上限(没有上限,会一直上升)
  4. 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'))

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值