繁体   English   中英

使用Python线程是否安全/良好?

[英]Is this usage of Python threading safe/good?

我有一个应用程序,该应用程序从某些URL中获取一些结果,然后必须根据结果做出决定(即:选择最佳结果并将其显示给用户)。 由于我要检查几个URL,因此这是第一次非常需要多线程。

因此,借助一些示例,我编写了以下测试代码:

import threading
import urllib2

threadsList = []
theResultList = []

def get_url(url):
    result = urllib2.urlopen(url).read()
    theResultList.append(result[0:10])

theUrls = ['http://google.com', ' http://yahoo.com']

for u in theUrls:
    t = threading.Thread(target=get_url, args=(u,))
    threadsList.append(t)
    t.start()
    t.join()

print theResultList

这似乎可行,但是我在这里确实没有安全感,因为我几乎没有多线程经验。 我总是听到这些术语,例如“线程安全”和“竞赛条件”。

我当然读过这些东西,但是由于这是我第一次使用这样的东西,所以我的问题是:这样做可以吗? 我是否会忽略任何负面或意外的影响? 有什么方法可以改善这一点?

欢迎所有提示!

当多个线程修改同一个对象时,您必须担心竞争条件。 在您的情况下,您具有这种确切条件-所有线程都在修改theResultList

但是,Python的列表是线程安全的- 在此处了解更多信息 因此,从多个线程向列表append s不会以某种方式破坏列表结构-但是,您仍然必须注意保护对单个列表元素的并发修改。 例如:

# not thread safe code! - all threads modifying the same element
def get_url(url):
    result = urllib2.urlopen(url).read()

    #in this example, theResultList is a list of integers
    theResultList[0] += 1

在您的情况下,您没有做这样的事情,因此您的代码很好。

旁注:递增整数的原因不是线程安全的,是因为它实际上是两个操作-一个操作读取值,一个操作递增值。 一个线程可以在这两个步骤之间被中断(另一个也希望增加相同变量的线程)–这意味着当该线程最终在第二个步骤中确实增加时,可能正在增加一个过时的值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM