全球主机交流论坛

标题: 求指点!自己写的PY CPU100%,但Python果然是树莓派原配! [打印本页]

作者: mymyhope    时间: 2019-3-18 23:37
标题: 求指点!自己写的PY CPU100%,但Python果然是树莓派原配!
感谢之前很多大佬领路!愉快的入了树莓派3B,使用体验很好√接了个传感器,自己写了点,但是为啥一直100%占满了1核...

import RPi.GPIO as GPIO
import time

#States File Store Location
ramdisk = "/root/ramdisk0/"

#Init GPIO
def init():
    #No GPIO warnings.
    #GPIO.setwarnings(False)

    #Set mode
    GPIO.setmode(GPIO.BOARD)

    #Set Which Pin
    GPIO.setup(7,GPIO.IN)
    pass

def detct():
    while True:
        curtime = time.strftime('%Y-%m-%d-%H-%M-%S',time.localtime(time.time()))
        #High level
        if GPIO.input(7) == True:
            #Alert and update states file to 1(Triggered)
            alert(curtime)
            writedown('1')
        else:
            writedown('0')
            continue
        time.sleep(2)


def alert(curtime):
    print(curtime + "Senser Triggered.")

#Update Triggered
def writedown(states):
    with open(ramdisk+'human-senser.txt','w+') as f:
        f.write(states)

time.sleep(2)

#Starting Loop
init()
detct()
GPIO.cleanup()


求助为什么这段那么简单的代码能卡住一个核QAQ...写文件的地方还是用了内存盘。

难道GPIO有那么占用资源?还是time.sleep有毒...??还是树莓派就连个sleep都能沾满?
作者: pulpfunction    时间: 2019-3-18 23:43
没玩过 帮顶
作者: mengyalei    时间: 2019-3-18 23:48
虽然看不懂代码,但是我觉得你代逻辑有问题
作者: VPSMarket    时间: 2019-3-18 23:50
Python 本来就是单进程 你一个循环里面才sleep 2  而且树莓派的处理能力毕竟是弱
作者: imes    时间: 2019-3-18 23:52
提示: 作者被禁止或删除 内容自动屏蔽
作者: mymyhope    时间: 2019-3-18 23:57
imes 发表于 2019-3-18 23:52
代码逻辑问题,导致一直在IO硬盘。

应该不存在io问题。这里特地是用内存盘来写数据了!
作者: mymyhope    时间: 2019-3-18 23:58
VPSMarket 发表于 2019-3-18 23:50
Python 本来就是单进程 你一个循环里面才sleep 2  而且树莓派的处理能力毕竟是弱  ...

这里应该是sleep了2秒了。还是不够吗QAQ
作者: tem    时间: 2019-3-19 01:29
应该是一硬件垃圾的锅
作者: ztech    时间: 2019-3-19 01:34
sleep会导致100%,你可以用threading.Timer,基本上CPU会降到3%以下
作者: hndrbd    时间: 2019-3-19 07:02
问题在continue
作者: bearqq    时间: 2019-3-19 08:20
            writedown('0')
            continue
        time.sleep(2)
如果没有触发,那么直接continue所以跳过了sleep
作者: mymyhope    时间: 2019-3-19 09:16
bearqq 发表于 2019-3-19 08:20
writedown('0')
            continue
        time.sleep(2)

好的!我试试把sleep放到while的最前面。谢谢大佬。
作者: 禁止访问    时间: 2019-3-19 12:20
我就看到了英文字母 或者符合  其他的不懂了。
作者: kimibowerman    时间: 2019-3-19 13:03
看起来锅大概率在continue上
一直while true cpu能不高么。。
作者: flcx    时间: 2019-3-19 13:58
mymyhope 发表于 2019-3-19 09:16
好的!我试试把sleep放到while的最前面。谢谢大佬。

既然你的永真循环里面if...else后面就一个sleep,又想每隔2秒做一次判断,干嘛还来个continue跳出本循环呢?删掉不就好了。
作者: mymyhope    时间: 2019-3-19 14:17
flcx 发表于 2019-3-19 13:58
既然你的永真循环里面if...else后面就一个sleep,又想每隔2秒做一次判断,干嘛还来个continue跳出本循环 ...

噗……是我傻了!谢谢大佬一语点醒!
作者: czb123    时间: 2019-3-19 14:53
不应该用while loop,应该用interrupt IRQ来做
作者: vForce    时间: 2019-3-19 15:14
因为detect下是while True,所以CPU是占用100%的。我没记错的话,sleep好像还是占用CPU的,只是不做事,这个有待考证。另外里面有continue,可能导致sleep没有被执行到
作者: 0000000    时间: 2019-3-19 15:59
continue 去了.




欢迎光临 全球主机交流论坛 (https://fd.vvwvv.eu.org/) Powered by Discuz! X3.4