吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1056|回复: 17
收起左侧

[已解决] python代码不知道哪里错了。

 关闭 [复制链接]
gongsui 发表于 2020-10-13 09:32
本帖最后由 gongsui 于 2020-10-14 21:14 编辑

多进程的代码,按视频代码核对了一晚上了,还是错误。

问题:Consumer代码未执行,视频上是 Consumer和Producer交替执行的。

[Python] 纯文本查看 复制代码
from multiprocessing import Process, Semaphore, Lock, Queue
import time
from random import random

buffer = Queue(10)
empty = Semaphore(2)
full = Semaphore(0)
lock = Lock()

class Consumer(Process):

    def run(self):
        global buffer, empty, full, lock

        while True:
            full.acquire()
            lock.acquire()
            print(f'Consumer get {buffer.get()}')
            time.sleep(1)
            lock.release()
            empty.release()


class Producer(Process):
    def run(self):
        global buffer, empty, full, lock
        while True:
            empty.acquire()
            lock.acquire()
            num = random()

            print(f'Producer append an {num}')
            buffer.put(num)
            time.sleep(1)
            lock.release()
            full.release()


if __name__ == '__main__':
    p = Producer()
    c = Consumer()
    p.daemon = True
    c.daemon = True
    p.start()
    c.start()
    p.join()
    c.join()

    print('Ended!')


----

谢谢各位,应该是多进程在windows下的问题。

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
lihaiyangya + 1 + 1 用心讨论,共获提升!

查看全部评分

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

vlinuxie 发表于 2020-10-13 09:35
帮你顶一下
isroot 发表于 2020-10-13 09:42
empty = Semaphore(2)
你这个设置的是2 导致的Producer 可以申请两个资源。
改成1 就是交替了
菜鸟--不二 发表于 2020-10-13 09:55
 楼主| gongsui 发表于 2020-10-13 10:37
isroot 发表于 2020-10-13 09:42
empty = Semaphore(2)
你这个设置的是2 导致的Producer 可以申请两个资源。
改成1 就是交替了

改成1也是一样,Consumer还是没有运行。
c03xp 发表于 2020-10-13 11:21
multiprocessing库是基于进程的,相当于linux里的fork(),生产者改变了buffer,但是消费者进程里的buffer 是另外一个副本,它仍然是空的。

pzx521521 发表于 2020-10-13 11:31
linux 下和 windows 下的实现不一样
不推荐在windows 下调用多进程/多线程
官网明确说明了多线程 并不支持windows(多线程版本里面很乱的)
其实所有的python 都是以unix系统为准
测试如下: 左边linux 右边windows

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
gongsui + 1 + 1 谢谢@Thanks!

查看全部评分

cqfcy 发表于 2020-10-13 11:50
调整一下,也能实现交替操作
[Python] 纯文本查看 复制代码
from multiprocessing import Process, Semaphore, Lock, Queue
import time
from random import random

def consumer(buffer, lock, empty, full):
    # while not buffer.empty():
    while True:
        full.acquire()
        lock.acquire()
        print(f'Consumer get {buffer.get()}')
        time.sleep(1)
        lock.release()
        empty.release()


def producer(buffer, lock, empty, full):
     while True:
        empty.acquire()
        lock.acquire()
        num = random()
        print(f'Producer append an {num}')
        buffer.put(num)
        time.sleep(1)
        lock.release()
        full.release()


if __name__ == '__main__':
    buffer = Queue(10)
    empty = Semaphore(2)
    full = Semaphore(0)
    lock = Lock()

    p = Process(target=producer, args=(buffer, lock, empty, full))
    c = Process(target=consumer, args=(buffer, lock, empty, full))
    p.daemon = True
    c.daemon = True
    p.start()
    c.start()
    p.join()
    c.join()

    print('Ended!')

图片.png

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
gongsui + 1 + 1 谢谢@Thanks!

查看全部评分

rsnodame 发表于 2020-10-13 13:18
报错信息是啥?
 楼主| gongsui 发表于 2020-10-13 21:25
c03xp 发表于 2020-10-13 11:21
multiprocessing库是基于进程的,相当于linux里的fork(),生产者改变了buffer,但是消费者进程里的buffer  ...

buffer 变量是global的,生产者和消费者应该用同一个变量的吧
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

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

GMT+8, 2025-1-11 18:39

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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