2015-07-20 83 views
4

几周前我开始用Python进行编程,并试图使用信号量来同步两个简单的线程,用于学习目的。这里是我得到的:Python上的信号量

import threading 
sem = threading.Semaphore() 

def fun1(): 
    while True: 
     sem.acquire() 
     print(1) 
     sem.release() 

def fun2(): 
    while True: 
     sem.acquire() 
     print(2) 
     sem.release() 

t = threading.Thread(target = fun1) 
t.start() 
t2 = threading.Thread(target = fun2) 
t2.start() 

但它保持打印只是1。我怎样才能对印刷品进行中间缩放?

回答

2

它工作正常,只是它的打印速度太快,你看不到。尝试把两种功能的time.sleep()(少量)睡觉线程的时间量多,居然能同时看到1以及2

示例 -

import threading 
import time 
sem = threading.Semaphore() 

def fun1(): 
    while True: 
     sem.acquire() 
     print(1) 
     sem.release() 
     time.sleep(0.25) 

def fun2(): 
    while True: 
     sem.acquire() 
     print(2) 
     sem.release() 
     time.sleep(0.25) 

t = threading.Thread(target = fun1) 
t.start() 
t2 = threading.Thread(target = fun2) 
t2.start() 
+0

Thx寻求帮助,但是我发现了真正的问题,因为我在两个线程中都使用相同的信号量,第一个信号几乎立即完成,因此第二个信号无法获得锁定并执行。 –

+0

@VictorTurrisi如果你输入一个大范围并运行你的程序,然后将输出重定向到一个文件然后检查该文件,你可能会看到“2”确实被打印出来,但是,它像很多1,然后很多2,然后又是很多1,等等。这是因为它执行得太快,你需要在它们之间放置一个'time.sleep()'来看它们是否一个接一个地执行。 –

0

我使用此代码来演示1线程如何使用Semaphore,另一个线程将等待(非阻塞),直到Sempahore可用。

这是使用Python3.6编写的;未在任何其他版本上测试。

这只会工作是同步正在从同一个线程完成,来自单独进程的IPC将无法使用此机制。

import threading 
from time import sleep 
sem = threading.Semaphore() 

def fun1(): 
    print("fun1 starting") 
    sem.acquire() 
    for loop in range(1,5): 
     print("Fun1 Working {}".format(loop)) 
     sleep(1) 
    sem.release() 
    print("fun1 finished") 



def fun2(): 
    print("fun2 starting") 
    while not sem.acquire(blocking=False): 
     print("Fun2 No Semaphore available") 
     sleep(1) 
    else: 
     print("Got Semphore") 
     for loop in range(1, 5): 
      print("Fun2 Working {}".format(loop)) 
      sleep(1) 
    sem.release() 

t1 = threading.Thread(target = fun1) 
t2 = threading.Thread(target = fun2) 
t1.start() 
t2.start() 
t1.join() 
t2.join() 
print("All Threads done Exiting") 

当我运行这个 - 我得到以下输出。

fun1 starting 
Fun1 Working 1 
fun2 starting 
Fun2 No Semaphore available 
Fun1 Working 2 
Fun2 No Semaphore available 
Fun1 Working 3 
Fun2 No Semaphore available 
Fun1 Working 4 
Fun2 No Semaphore available 
fun1 finished 
Got Semphore 
Fun2 Working 1 
Fun2 Working 2 
Fun2 Working 3 
Fun2 Working 4 
All Threads done Exiting 
0

您还可以使用锁定/互斥方法如下:

import threading 
import time 

mutex = threading.Lock() # equal to threading.Semaphore(1) 


def fun1(): 
    while True: 
     mutex.acquire() 
     print(1) 
     mutex.release() 
     time.sleep(0.5) 


def fun2(): 
    while True: 
     mutex.acquire() 
     print(2) 
     mutex.release() 
     time.sleep(0.5) 

t1 = threading.Thread(target=fun1).start() 
t2 = threading.Thread(target=fun2).start() 

另一个/更简单的使用类型:

import threading 
import time 

mutex = threading.Lock() # equal to threading.Semaphore(1) 


def fun1(): 
    while True: 
     with mutex: 
      print(1) 
     time.sleep(0.5) 


def fun2(): 
    while True: 
     with mutex: 
      print(2) 
     time.sleep(0.5) 

t1 = threading.Thread(target=fun1).start() 
t2 = threading.Thread(target=fun2).start() 

注: additionaly difference between mutex and semaphoremutex VS semaphore