Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 每个线程都有单独的变量_Python_Multithreading - Fatal编程技术网

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
已经是局部变量的观点是正确的,但怀疑“问题”是因为
会话
获取
的实现方式——相反,我怀疑这是因为
做一些事情
是什么(和/或主线程中的代码也未显示)。如果没有显示,则无法确定。