python семафор в обработке - PullRequest
       73

python семафор в обработке

0 голосов
/ 05 августа 2020

Следующий код работает нормально:


import threading
semaphore = threading.Semaphore(0)
def consumer():
        semaphore.acquire()
        print("consumer next")
def producer():
        print("producer first")
        semaphore.release()
if __name__ == '__main__':
    t1 = threading.Thread(target=producer)
    t2 = threading.Thread(target=consumer)
    t1.start()
    t2.start()

Приведенный выше код отражает проблему производителей-потребителей потоков. Результат печати:

сначала производитель

следующий потребитель

Итак, я хочу использовать семафор процесса, но он не работает


from multiprocessing import Process, Semaphore
s = Semaphore(0)

class producer(Process):
    def __init__(self):
        super().__init__()
    def run(self):
        global s
        print("producer first")  
        s.release()

class consumer(Process):
    def __init__(self):
        super().__init__()
    def run(self):
        global s
        s.acquire()
        print("consumer next")

if __name__ == '__main__':
    p1 = producer()
    p2 = consumer()
    p1.start()
    p2.start()

"потребитель следующий" не показывает, что я неправильно написал, почему?

Как решить, пожалуйста.

1 Ответ

0 голосов
/ 07 августа 2020

Я думаю, причина в том, что глобальные переменные прозрачны для процессов, поэтому я передаю переменные вместо использования глобальных переменных. Проблема решена!

from multiprocessing import Process, Semaphore
class producer(Process):
    def __init__(self,s):
        super().__init__()
        self.s=s
    def run(self):
        print("producer first")
        self.s.release()

class consumer(Process):
    def __init__(self,s):
        super().__init__()
        self.s=s
    def run(self):
        self.s.acquire()
        print("consumer next")

if __name__ == '__main__':
    s = Semaphore(0)
    p2 = consumer(s)
    p2.start()
    #p2 start first ,but show result next
    p1 = producer(s)
    p1.start()
...