关于python中gevent的问题

download方法的调用都在一个线程吗?这段代码能保证bodys线程安全吗?

from gevent import monkey; monkey.patch_all()
import gevent
import requests


def dowload(page, bodys):
    body = requests.get("http://baidu.com").content
    bodys.append(body)
    print "------>", page


a = 0
while True:
    arr = []
    bodys = []
    for i in range(100):
        g = gevent.spawn(dowload, i, bodys)
        arr.append(g)

    for g in arr:
        g.join()

    for body in bodys:
        # do sometime
        pass

    print '--------------------------------------------------------------------------------'
阅读 4.9k
2 个回答

1.gevent是一个基于协程的网络库
2.这里的bodys变量有写入操作,可能会有写入顺序不一样的问题,但是由于本身就只有一个线程在执行,不会存在两个协程同时读写同一个对象,协程是交互执行的,所以我认为线程和协程上都是安全的

你这段代码可能还有一个问题, 因为requsts是同步阻塞的, 你虽然使用了gevent, 但是程序在实际的运行中, 依旧可能是被阻塞的, 没有发挥出gevent的优势.你可以试试看gevent.monkey.patch_all(httplib=True)(现在的gevent已经不支持gevent.httplib).具体可以参考http://stackoverflow.com/ques... 或者直接使用grequests.

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题