python多線程修改共享全局變量不安全

當(dāng)需要對(duì)全局變量進(jìn)行更改時(shí)表谊,則會(huì)出現(xiàn)不安全的情況

# -*- coding: utf-8 -*-

"""================================================================================================================
@date     :  2022/8/17  16:06
@function :  自動(dòng)轉(zhuǎn)發(fā)用戶正常入線chat至指定在線客服
================================================================================================================"""

import json
import time
import requests
from loguru import logger
from datetime import datetime
from concurrent.futures import ThreadPoolExecutor

from utils.common import open_gsheet


class AUTO_TRANSFER_CHAT:
    def __init__(self):
        self.headers = {
                'accept': '*/*',
                'accept-encoding': 'gzip, deflate, br',
                'accept-language': 'zh-CN,zh;q=0.9',
                'authorization': '',
                'content-type': 'text/plain;charset=UTF-8',
                'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36',
        }
        self.shop_id_dict = {
            '476792408':'CO', '446091597':'TH', '476792515':'CL', '446090097':'TW',
            '446089250':'VN', '538890515':'PL', '426378412':'BR', '445275287':'SG', '426377685':'PH',
            '445279067':'MY', '868341135': 'MY_2','426379311':'MX', '558513120':'ES'
        }

    def get_auths(self):
        """獲取在線客服"""
        sheet = open_gsheet('L.OP3.3-Mass Outbound Chat Tool[Lovito]', 'Online status')
        datas = sheet.get_values('A2:E')
        account_auths = []
        for data in datas:
            account_auths.append((data[0].strip(), data[4].strip()))
        logger.info(f'account_auths: {len(account_auths)}, {account_auths[:5]}')
        return account_auths

    def _request_get(self, url, account):
        i = 0
        while i < 3:
            try:
                response = requests.get(url, headers=self.headers, timeout=30)
                response = response.json()
                return response
            except Exception as e:
                i += 1
                print(f'try {i} times, {account} {e.args}')
        else:
            raise Exception(f'{account} request error')

    def _request_put(self, url, payload, to_name):
        i = 0
        while i < 3:
            try:
                response = requests.put(url, data=json.dumps(payload), headers=self.headers, timeout=30)
                return response
            except:
                i += 1
                print(f'try {i} times, {to_name}')
        else:
            raise Exception(f'{to_name} transfer error')

    def get_all_unread(self, account_auth, index, l):
        account, auth = account_auth[0], account_auth[1]
        url = 'https://seller.ph.shopee.cn/webchat/api/v1.2/subaccount/conversations?direction=older&_s=1&type=unread'
        self.headers['authorization'] = auth + account            # 多線程更改全局變量不安全径簿!這里的authorization和account不一定和lovitocs:outbound_receive201相同
        if account == 'lovitocs:outbound_receive201':
            print(account, self.headers)
        response = self._request_get(url, account)
        try:
            conversations = [(i['id'], i['shop_id'], i['to_id'], i['to_name']) for i in response]
        except:
            raise Exception(response)
        logger.info(f'{index}/{l} {account}, conversations: {len(conversations)}, {conversations}')
        return conversations

    def parse_exception(self, obj):
        result = obj.result()
        if result:
            print(result)

    def treat_one_account_unit(self, account_auth, index, l):
        account, auth = account_auth[0], account_auth[1]
        th_timestamp = int(time.mktime(time.strptime((datetime.now()).strftime('%Y-%m-%d') + ' 10:30:00', '%Y-%m-%d %H:%M:%S')))
        vn_timestamp = int(time.mktime(time.strptime((datetime.now()).strftime('%Y-%m-%d') + ' 08:30:00', '%Y-%m-%d %H:%M:%S')))
        now = time.time()
        if (now > th_timestamp) or (now > vn_timestamp and 'agentvncb' in account) or 'lovitocs:outbound_receive' in account:
            pass
        else:
            return
        self.get_all_unread(account_auth, index, l)

    def treat_one_account(self, index, l, account_auth):
        logger.info(f'{index}/{l} {account_auth[:2]}')
        self.treat_one_account_unit(account_auth, index, l)

    def main(self):
        account_auths = [('lovitocs:outbound_receive201', 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJjcmVhdGVfdGltZSI6MTY2OTY3NDE2NSwiaWQiOiIyZWMxZTA4ZS02ZjZiLTExZWQtODc2Yi1mNGVlMDgwZWU3ZDAifQ.raDQAjwn_BNRqZrKc7DtHkdLVWJad80gHSoDGT7VOkU'), ('lovitocs:outbound_receive202', 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJjcmVhdGVfdGltZSI6MTY2OTY3NDE3MCwiaWQiOiIzMTk4YTYxMS02ZjZiLTExZWQtYjUwMi1mNGVlMDgxNmQ1MGMifQ.dEnbrfmgVuD3dECXxpkMPeLCF-o42wV9UCyJIfo2Et8'), ('lovitocs:outbound_receive203', 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJjcmVhdGVfdGltZSI6MTY2OTY3NDIwMSwiaWQiOiI0NDU2ZGZhZi02ZjZiLTExZWQtYTQ2Ni1hZTc2MDgzM2U3ZTEifQ.AFnmPrgdxt7d216pYdURegu5XQ1q8NBcIbM3ndlYHes'), ('lovitocs:outbound_receive204', 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJjcmVhdGVfdGltZSI6MTY2OTY3NDIzMSwiaWQiOiI1NjAwNmM0Ni02ZjZiLTExZWQtOWMxNS1mNGVlMDgwZDI2NGQifQ.8p873dTdrlyF6PTGB4-46jPVfstR0JrNTuZWQCD9LF0'), ('lovitocs:outbound_receive205', 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJjcmVhdGVfdGltZSI6MTY2OTY3NDIzMiwiaWQiOiI1NmIwYTY3Zi02ZjZiLTExZWQtODc5Zi1mNGVlMDgxNDI4YmUifQ.v79Xoeg0v6q_xaxC6RMpfJmSWQKtdc9D91N7SC1JgA0')]
        exector = ThreadPoolExecutor(max_workers=10)
        for index, account_auth in enumerate(account_auths):
            if index < 0:
                continue
            exector.submit(self.treat_one_account, index, len(account_auths), account_auth).add_done_callback(self.parse_exception)
        exector.shutdown(wait=True)


if __name__ == '__main__':
    a = AUTO_TRANSFER_CHAT()
    a.main()



改進(jìn)措施:不直接修改全局變量:

header = self.headers.copy()
header['authorization'] = auth + account
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末枣耀,一起剝皮案震驚了整個(gè)濱河市枢里,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌盒至,老刑警劉巖缺谴,帶你破解...
    沈念sama閱讀 222,104評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異女责,居然都是意外死亡漆枚,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門抵知,熙熙樓的掌柜王于貴愁眉苦臉地迎上來墙基,“玉大人软族,你說我怎么就攤上這事〔兄疲” “怎么了立砸?”我有些...
    開封第一講書人閱讀 168,697評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)初茶。 經(jīng)常有香客問我颗祝,道長(zhǎng),這世上最難降的妖魔是什么恼布? 我笑而不...
    開封第一講書人閱讀 59,836評(píng)論 1 298
  • 正文 為了忘掉前任螺戳,我火速辦了婚禮,結(jié)果婚禮上桥氏,老公的妹妹穿的比我還像新娘温峭。我一直安慰自己,他們只是感情好字支,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評(píng)論 6 397
  • 文/花漫 我一把揭開白布凤藏。 她就那樣靜靜地躺著,像睡著了一般堕伪。 火紅的嫁衣襯著肌膚如雪揖庄。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,441評(píng)論 1 310
  • 那天欠雌,我揣著相機(jī)與錄音蹄梢,去河邊找鬼。 笑死富俄,一個(gè)胖子當(dāng)著我的面吹牛禁炒,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播霍比,決...
    沈念sama閱讀 40,992評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼幕袱,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了悠瞬?” 一聲冷哼從身側(cè)響起们豌,我...
    開封第一講書人閱讀 39,899評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎浅妆,沒想到半個(gè)月后望迎,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,457評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡凌外,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評(píng)論 3 341
  • 正文 我和宋清朗相戀三年辩尊,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片康辑。...
    茶點(diǎn)故事閱讀 40,664評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡对省,死狀恐怖蝗拿,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情蒿涎,我是刑警寧澤哀托,帶...
    沈念sama閱讀 36,346評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站劳秋,受9級(jí)特大地震影響仓手,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜玻淑,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評(píng)論 3 334
  • 文/蒙蒙 一嗽冒、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧补履,春花似錦添坊、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至谚攒,卻和暖如春阳准,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背馏臭。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工野蝇, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人括儒。 一個(gè)月前我還...
    沈念sama閱讀 49,081評(píng)論 3 377
  • 正文 我出身青樓绕沈,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親帮寻。 傳聞我的和親對(duì)象是個(gè)殘疾皇子七冲,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評(píng)論 2 359