每个线程分别使用变量

时间:2019-03-18 21:24:39

标签: python multithreading

我在线程之间传递值时遇到问题。我只希望每个线程一旦启动都具有仅线程值的变量。例如,如果我有一个requests.session,我不希望线程1和2的会话相同。

import requests
import threading

def functionName():
   s=requests.session()
   r=s.get("") #get a random site
   #do some things

if __name__== "__main__":
    t=threading.Thread(target=functionName)
    tt=threading.Thread(target=functionName)
    t.start()
    tt.start()

如果我添加其他操作而不是#do some things并将整个结果保存在文件中,则即使我希望两个线程分别分开,这两个线程似乎合并并在一个唯一的会话中工作线。

1 个答案:

答案 0 :(得分:1)

从您对问题的描述以及rs 已经在每个线程本地开始的事实来看(如@Solomon Slow在注释中指出的那样),我怀疑问题出在您如何从每个线程获取结果。

由于您尚未提供MCVE,因此我整理了一些方法来说明可以完成的方法。其中,每个线程的结果都存储在名为merged的共享全局字典中。从输出中可以看到,两个线程没有相互干扰。

from ast import literal_eval
import requests
import threading
from random import randint


def functionName(thread_name, shared, lock):
    s = requests.Session()
    sessioncookie = str(randint(100000000, 123456789))
    s.get('https://httpbin.org/cookies/set/sessioncookie/' + sessioncookie)
    r = s.get('https://httpbin.org/cookies')
    r_as_dict = literal_eval(r.text)

    print('r_as_dict:', r_as_dict)

    # Store result in shared dictionary.
    with lock:
        shared[thread_name] = r_as_dict['cookies']['sessioncookie']


if __name__ == '__main__':

    merged = {}
    mlock = threading.Lock()  # Control concurrent access to "merged" dict.

    t=threading.Thread(target=functionName, args=('thread1', merged, mlock))
    tt=threading.Thread(target=functionName, args=('thread2', merged, mlock))
    t.start()
    tt.start()
    t.join()
    tt.join()

    print(merged)

示例输出:

r_as_dict: {'cookies': {'sessioncookie': '111147840'}}
r_as_dict: {'cookies': {'sessioncookie': '119511820'}}
{'thread1': '111147840', 'thread2': '119511820'}