我在线程之间传递值时遇到问题。我只希望每个线程一旦启动都具有仅线程值的变量。例如,如果我有一个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
并将整个结果保存在文件中,则即使我希望两个线程分别分开,这两个线程似乎合并并在一个唯一的会话中工作线。
答案 0 :(得分:1)
从您对问题的描述以及r
和s
已经在每个线程本地开始的事实来看(如@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'}