如何在Gevent的特定线程中锁定运行某些代码块?

时间:2018-02-28 16:49:03

标签: python gevent

简化代码看起来像

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


def f1():
    print("Thread 1 start")
    x = get('https://www.google.com')
    print("Thread 1 end")


def f2():
    print("Thread 2")


gevent.joinall([
    gevent.spawn(f1),
    gevent.spawn(f2)
])

预期输出:

  

线程1开始
  线程2
  线程1结束

我需要锁定get请求的调用。所以,我需要得到以下输出:

  

线程1开始
  螺纹1端
  线程2

如何实现这样的get请求锁定?

1 个答案:

答案 0 :(得分:0)

您应该这样做:

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

from gevent.lock import Semaphore

sem = Semaphore()

def f1():
    sem.acquire()
    print("Thread 1 start")
    gevent.sleep(0.1)
    print("Thread 1 end")
    sem.release()

def f2():
    with sem:
        print("Thread 2")

gevent.joinall([
    gevent.spawn(f1),
    gevent.spawn(f2)
])