Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/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_Scope - Fatal编程技术网

python函数是线程安全的吗?(尤其是这个?)

python函数是线程安全的吗?(尤其是这个?),python,multithreading,scope,Python,Multithreading,Scope,在回答之前,请理解我不希望你为我做这项工作。对于我的问题(可能是理论上的)存在的原因,我希望能有一个措辞清晰的答案,并解释解决问题的过程。当有人只为我工作时,我发现很难正确地学习。先谢谢你 我有一个功能:它做的和它看起来做的完全一样。它使用包含facebook ID的页面中的html,并在找到ID后返回该ID def getID(data): #Find an ID from HTML input. data = str(data) appstring = 'http://app

在回答之前,请理解我不希望你为我做这项工作。对于我的问题(可能是理论上的)存在的原因,我希望能有一个措辞清晰的答案,并解释解决问题的过程。当有人只为我工作时,我发现很难正确地学习。先谢谢你

我有一个功能:它做的和它看起来做的完全一样。它使用包含facebook ID的页面中的html,并在找到ID后返回该ID

def getID(data): #Find an ID from HTML input.
    data = str(data)
    appstring = 'http://apps.facebook.com/castle_age/keep.php?user=' #We're gonna find this in the html.
    appstr_start_pos = data.find(appstring) #Tell us where we found it oh mighty one!
    if appstr_start_pos != -1: #If we find it.
        begin_ID_pos = appstr_start_pos + len(appstring)
        end_ID_pos = data.find('"', begin_ID_pos) #Find the end quote, that'll be the end of our ID string.

        our_ID = data[begin_ID_pos:end_ID_pos]
        return our_ID
现在我没有将它打包到使用thread.Threading方法的类中,但我仍然定期调用它。我的代码现在只运行一个线程,可能需要从另一个线程类调用这个函数;这可能吗?如果没有,如何在线程类之间使用此函数

一个更简单的问题:若我从多线程环境调用这个函数,我会有问题吗,还是需要将它移动到自己的类中?有没有一种方法可以使函数在两个不同的线程对象之间保持可用(如果有,最简单的方法是什么)

下面是完整的代码:--请记住这是一个WIP,作为学习线程的练习

一个更简单的问题:如果我从多线程环境调用这个函数,我会有问题吗

是的,据我所知,它是线程安全的

或者我需要把它转移到它自己的类中吗


线程安全与类无关:它与共享状态有关。如果线程共享状态,则必须作出规定,以线程安全的方式访问/更改此状态,即使用锁。

内置函数
len()
str()
,在您的函数中使用的
str()
可以在其他线程中进行猴补丁。

这并不容易,因为每个
get*()
函数都可以使用缓存。
所以每次通话都可能导致数据更改。->问题

+1:该函数似乎只是获取内容,而不是更新任何内容。如果另一个函数同时更新
数据
,那么您将遇到线程安全问题。因此,请澄清一下,如果我有两个线程(同时)调用getID,并且它们都传递了各自的字符串对象,那么这不会失败?@Thantik:正确。函数没有改变任何共享状态。@ThantiK:关键是数据项没有改变。是否有两个单独的字符串对象并不重要。两个线程都可以使用同一个字符串对象,因为没有发生任何变化。“理解Python GIL”描述了Python线程的工作方式(除其他外),我最近读了很多关于GIL的文章,特别是当Python3.2 GIL中有一个线程IO绑定和另一个CPU绑定时,davids使用优先级线程来解决CPU/IO绑定问题。但是,当python调用一个函数时……它会复制该函数吗?(因此,如果调用该函数(只要它没有修改函数上方的某个作用域),它不会与同时调用它的另一个线程冲突?我不需要任何人关心数据。或者它是一个可变对象,在这种情况下,它的字符串表示形式由数据返回。_ustr_uu_;(),它创建了一个新对象,或者数据已经是一个字符串,这仍然很酷,因为Python字符串是不可变的。因此,不管其他线程是否修改数据,它在getID()中应该没有副作用。