python函数线程安全吗? (特别是这一个?)

时间:2010-02-28 22:26:12

标签: python multithreading scope

在回答之前,请理解我不希望你为我做这项工作。我更愿意回答一个措辞性的答案,为什么我的(可能是理论上的)问题存在,并且解释了修复它的过程。当有人为我做这项工作时,我觉得更难学好。提前谢谢。

我有这个功能:它完全像它正在做的那样。它使用的是包含facebook ID的页面中的html,并在找到后返回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方法的类中,但我仍然会定期调用它。我的代码现在只运行一个线程,我可能需要从另一个线程类调用此函数;这可能吗?如果没有,我如何在线程类之间使用此函数?

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

以下是完整代码:http://pastebin.com/txH8PvL3 - 请注意,它是一个WIP,作为学习线程的练习......

3 个答案:

答案 0 :(得分:7)

  

一个更简单的问题形式:如果我从多线程环境中调用此函数,我是否会遇到问题,

是的,我可以告诉它是线程安全的

  

还是我需要把它移到自己的班级?

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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