Python 每个线程都有单独的变量
我对从一个线程传递到另一个线程的值有问题。我只想让每个线程在启动后都有一个变量,该变量的值为纯线程。例如,如果我有一个Python 每个线程都有单独的变量,python,multithreading,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__":
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()
如果我添加其他操作而不是
#做一些事情
,并将整个结果保存在一个文件中,那么看起来两个线程合并并在一个唯一的会话中工作,即使我希望每个线程的两个会话是分开的 根据您对问题的描述,以及r
和s
已经是每个线程的本地线程(正如@Solomon Slow在评论中指出的),我怀疑问题在于如何从每个线程获得结果
因为你还没有提供一个解决方案,所以我编了一些东西来展示一种可以实现的方法。其中,每个线程的结果存储在名为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':{'sessioncokie':'111147840'}
r_as_dict:{'cookies':{'sessioncokie':'119511820'}
{'thread1':'111147840','thread2':'119511820'}
我想你说的是数据竞争,对吗?如果是,你可以创建一个锁函数来防止这种数据竞争情况。例如:def locking\u increment():使用db.get\u lock():return increment()
您还可以考虑使用进程而不是线程,因为进程不共享内存变量,r
和s
都是局部变量。它们不会在线程之间共享。因此,如果这里有任何问题,那就是在requests.session()
的实现中,或者在s.get()的实现中。这些函数看起来像什么?我认为@SolomonSlow关于r
和s
已经是局部变量的观点是正确的,但怀疑“问题”是因为会话
和获取
的实现方式——相反,我怀疑这是因为做一些事情
是什么(和/或主线程中的代码也未显示)。如果没有显示,则无法确定。