1
在通常的python线程和greenthread(eventlet)中,threading.Lock()
,threading.Semaphore()
行为有什么区别?python线程和绿色线程中锁定行为之间的任何区别?
在通常的python线程和greenthread(eventlet)中,threading.Lock()
,threading.Semaphore()
行为有什么区别?python线程和绿色线程中锁定行为之间的任何区别?
行为没有区别。但是,绿色线程实际上并不是线程,因为它在单个操作系统线程中运行其所有任务,所以threading.Lock
和threading.Semaphore
的行为就好像它正在从单个线程锁定和解锁一样。
这意味着如果您在使用绿色线程时尝试获取锁定锁定或归零信号量,则整个程序将永远阻塞(或直到指定的超时)。此外,RLock只能从它锁定的同一个线程中释放,因为绿色线程实际上都运行在同一线程上,您将能够从不同的绿色线程释放RLock。
总之,使用绿色线程时不要使用threading
锁。
感谢您的回答!那么绿色线程环境的锁定选择是什么? –
另一种方法是避免锁定,因为您可以精确控制上下文切换的发生时间,所以eventlet程序通常不需要锁定以防止程序在处理过程中相互踩踏。使用eventlet注意,您也可以对标准库进行猴补丁修补,这将使用eventlet锁代替线程模块中的锁。事件锁定实现的行为类似于相应的线程锁定,但也会导致线程退出,可能导致上下文切换。 –
啊,对!我们也使用猴子补丁!所以,使用猴子补丁可以安全地使用锁,对吧? –