吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1286|回复: 5
收起左侧

[讨论] 会python都来看下吧,多进程信号量问题

  [复制链接]
wxxwjy 发表于 2022-12-10 16:47
本帖最后由 wxxwjy 于 2022-12-10 16:56 编辑

代码在下边了
就是运行到c.start()运行不起来,明明在p.start()中full.release()了两次了,full信号量为2那c就可以运行了啊
还是我哪里写的有问题
1.png

2.png

3.png



发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

wanglong001 发表于 2022-12-10 22:17
感谢大佬,认真学习
一只大菜猫 发表于 2022-12-10 22:49
 楼主| wxxwjy 发表于 2022-12-11 14:40
jimaoge 发表于 2023-2-22 00:55
我猜测是因为你的full是个全局变量,3个进程都有一个full.
当p进程release的时候只会增加p进程的信号量,p进程full为2,主进程和c进程的full为0,所以c进程不会执行
可以去掉global,通过参数传递变量
p = Process(target=runp, args=(lock, empty, full, buffer))
c = Process(target=runc, args=(lock, empty, full, buffer))
pl0514 发表于 2023-2-22 16:32
楼上说的没问题。主要原因就是global。各个进程中默认变量不共享。global也就只能访问到自己进程的里面的数据。所以multiprocessing提供了类似Queue 这种可以多进程访问的类型。(可能就是内存地址共享)。所以创建进程直接传参就行,不要加global修饰。
class PrcProducer(Process):
    def __init__(self,lock, empty, full, buffer):
        Process.__init__(self)
        self.lock = lock
        self.empty = empty
        self.full = full
        self.buffer = buffer

    def run(self):

        while True:
            self.empty.acquire()
            self.lock.acquire()
            self.buffer.put(1)

            print('Producer push an element')
            time.sleep(1)
            self.lock.release()
            self.full.release()
if __name__ == '__main__':
         p = PrcProducer(lock, empty, full, buffer)
或者按照你的写法,global去掉就是
         p = Process(target=Consumer().run, args=(lock, empty, full, buffer))
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 02:45

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表