亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫(kù)
12下一頁
最近訪問板塊 發(fā)新帖
查看: 9787 | 回復(fù): 17
打印 上一主題 下一主題

求助:python樹莓派多線程編程 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2016-03-27 17:13 |只看該作者 |倒序?yàn)g覽
小弟初接觸樹莓派,想給孩子做一個(gè)孵化小雞的孵化箱。構(gòu)想是用5個(gè)18b20溫度傳感器分布于箱子內(nèi)不同位置讀取箱內(nèi)溫度,根據(jù)讀取到的溫度來通過gpio引腳控制繼電器線包,繼而控制電熱絲加熱,或者控制風(fēng)扇來降溫。如果箱內(nèi)溫度在設(shè)定范圍內(nèi),則保持恒溫(不加熱也不降溫)。同時(shí)還有l(wèi)cd1602用來顯示孵化時(shí)間/剩余時(shí)間等,7段數(shù)碼管組依次顯示5個(gè)溫度值,三色led顯示加熱/降溫/恒溫狀態(tài),以及定時(shí)寫入web頁,開啟一個(gè)簡(jiǎn)單web server,可以通過電腦手機(jī)等遠(yuǎn)程查看狀態(tài)。主控程序結(jié)構(gòu)大概如下:

  1. main():
  2.     while 1:
  3.         temp_lists=temp_get()//讀取傳感器的值到一個(gè)list
  4.         temp_avg=get_avg(temp_lists)//計(jì)算溫度平均值
  5.         if (temp_avg>temp_max):
  6.             dis_hot() //若平均值大于設(shè)定上限,則持續(xù)降溫
  7.         elif (temp_avg<temp_min):
  8.            hot() //若平均值小于下限,則持續(xù)加熱
  9.        else:
  10.            keep_warming() //否則保溫(不加熱也不降溫)
  11.        temp_display() //在數(shù)碼管上依次顯示5個(gè)傳感器溫度以及平均溫度,每秒1個(gè),共耗時(shí)6秒
復(fù)制代碼
初步的程序已經(jīng)調(diào)試通過,基本運(yùn)行正常,但發(fā)現(xiàn)一個(gè)致命的問題是:數(shù)碼管顯示子程序因?yàn)橐扛?秒依次顯示5組溫度和平均溫度,所以這個(gè)子程序需要花費(fèi)6秒的時(shí)間。在這個(gè)子程序6秒的執(zhí)行過程中,加熱或降溫子程序已經(jīng)持續(xù)運(yùn)行了6秒,有可能會(huì)使溫度大大超出設(shè)定范圍。所以想要把這個(gè)耗時(shí)較多的溫度顯示子程序設(shè)為多線程并發(fā)執(zhí)行,使得它不要阻塞主程序中的其他部分。
我在網(wǎng)上看了不少關(guān)于python多線程的例子,也做了些試驗(yàn),但一直也沒能理出個(gè)頭緒,所以還請(qǐng)諸位大俠打個(gè)幫手,畢竟已經(jīng)答應(yīng)了孩子,而且孩子都給小伙伴們?cè)S出贈(zèng)送小雞的承諾了。
火線求助!萬分感謝。!

論壇徽章:
22
2015年亞洲杯之科威特
日期:2015-04-18 15:27:07每日論壇發(fā)貼之星
日期:2016-01-27 06:20:0015-16賽季CBA聯(lián)賽之廣夏
日期:2016-03-28 16:20:51程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2016-04-09 06:20:00CU十四周年紀(jì)念徽章
日期:2016-05-03 09:35:1415-16賽季CBA聯(lián)賽之天津
日期:2016-11-18 08:31:3115-16賽季CBA聯(lián)賽之山西
日期:2016-12-07 16:29:5315-16賽季CBA聯(lián)賽之八一
日期:2017-01-10 11:34:3415-16賽季CBA聯(lián)賽之吉林
日期:2017-03-30 22:51:1915-16賽季CBA聯(lián)賽之廣夏
日期:2017-04-13 20:51:52程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2016-01-27 06:20:00每日論壇發(fā)貼之星
日期:2015-12-28 06:20:00
2 [報(bào)告]
發(fā)表于 2016-03-28 10:20 來自手機(jī) |只看該作者
進(jìn)來看看后,感覺很厲害的樣子,看來樓主是搞科研的,這么有科學(xué)性,意義性的實(shí)驗(yàn),在此預(yù)祝樓主取得成功哈。
但這個(gè)py版塊,很多真正py高手估計(jì)都很少時(shí)間上來,樓主可能要耐心點(diǎn)等待一下py高手到來

論壇徽章:
0
3 [報(bào)告]
發(fā)表于 2016-03-28 15:18 |只看該作者
本帖最后由 amduroncn 于 2016-03-28 16:14 編輯

你應(yīng)該建立一個(gè)線程同步事件,一個(gè)資源為1臨界資源的訪問的信號(hào)量


主線程 申請(qǐng)能臨界區(qū)的使用-》測(cè)溫》釋放臨界區(qū)訪問-》發(fā)通知-》-----loop
顯示線程 收通知-》重置事件-->申請(qǐng)臨界區(qū)使用權(quán)-》快速?gòu)?fù)制一個(gè)副本-》釋放臨界區(qū)資源使用-》顯示---loop


祝你小朋友成功孵出小雞!


以下是代碼
  1. # -*- coding: utf-8 -*-
  2. import threading
  3. import time
  4. import random
  5. # 建立一個(gè)繼承threading的線程實(shí)現(xiàn)類

  6. temp_lists = []


  7. class DisplayClass(threading.Thread):
  8.     def __init__(self):
  9.         threading.Thread.__init__(self)
  10.         #  初始化各種變量

  11.     def run(self):
  12.         while 1:
  13.             ready.wait()  # 等待測(cè)溫事件完成通知
  14.             ready.clear()  # 重置事件
  15.             sep.acquire()  # 對(duì)臨界區(qū)訪問,速度復(fù)制一個(gè)副本,
  16.             tmplists = temp_lists
  17.             tmpavg = temp_avg
  18.             sep.release()  # 釋放臨界區(qū)訪問
  19.             print(u"顯示溫度"+str(tmplists)+ u",平均溫度:"+str(tmpavg))
  20.             time.sleep(6)


  21. def temp_get():
  22.     # random.random()
  23.     temp_lists.append(random.random()*65)
  24.     if len(temp_lists) > 6:
  25.         temp_lists.pop(0)
  26.     return temp_lists


  27. def get_avg(l):
  28.     return sum(l)/len(l)


  29. def dis_hot():
  30.     pass


  31. def keep_warming():
  32.     pass


  33. def hot():
  34.     pass

  35. def main():
  36.     global temp_lists
  37.     global temp_avg
  38.     global ready
  39.     global sep;
  40.     temp_max = 40
  41.     temp_min = 35
  42.     ready = threading.Event()
  43.     sep = threading.Semaphore(1)
  44.     ready.clear()
  45.     threaddisdis = DisplayClass()
  46.     threaddisdis.start()
  47.     while 1:
  48.         sep.acquire()
  49.         temp_lists = temp_get()  # 讀取傳感器的值到一個(gè)list
  50.         temp_avg = get_avg(temp_lists)  # 計(jì)算溫度平均值
  51.         sep.release()
  52. # 發(fā)出通知顯示線程可以執(zhí)行
  53.         ready.set()

  54.         if temp_avg > temp_max:
  55.             dis_hot()  # 若平均值大于設(shè)定上限,則持續(xù)降溫
  56.             print(u'降溫')
  57.         elif temp_avg < temp_min:
  58.             hot()  # 若平均值小于下限,則持續(xù)加熱
  59.             print(u'加熱')
  60.         else:
  61.             keep_warming()   # 否則保溫(不加熱也不降溫)
  62.             print(u'保溫')
  63.         time.sleep(1)
  64. if __name__ == "__main__":
  65.     main()
復(fù)制代碼

評(píng)分

參與人數(shù) 1信譽(yù)積分 +10 收起 理由
Windows19 + 10 這個(gè)思路我給滿分10分

查看全部評(píng)分

論壇徽章:
0
4 [報(bào)告]
發(fā)表于 2016-03-28 22:43 |只看該作者
回復(fù) 2# Windows19

謝謝您的關(guān)注,厲害可不敢當(dāng),接觸python的時(shí)間不多,所以有點(diǎn)一籌莫展了。
   

論壇徽章:
0
5 [報(bào)告]
發(fā)表于 2016-03-28 22:49 |只看該作者
回復(fù) 3# amduroncn


非常感謝您如此具體的指教和幫助!我這就去試試看。關(guān)于python的多線程編程,我還只停留在start,join和setdeamon等函數(shù)上,希望能進(jìn)一步請(qǐng)教您。謝謝!

論壇徽章:
0
6 [報(bào)告]
發(fā)表于 2016-03-29 00:21 |只看該作者
本帖最后由 amduroncn 于 2016-03-29 00:30 編輯

不用客氣,我也是初學(xué)。從你的描敘來看,6秒就會(huì)使溫度超出范圍,可見你的發(fā)熱絲,功率貎似得大啊。何不使用PWM控制發(fā)熱絲,發(fā)熱絲可以用低壓的發(fā)熱絲(安全),結(jié)合PID控制,可把溫度做得很恒定喲。你現(xiàn)在的方案,繼電器會(huì)經(jīng)常動(dòng)作嗎?

論壇徽章:
11
2015年迎新春徽章
日期:2015-03-04 09:55:282017金雞報(bào)曉
日期:2017-02-08 10:39:4215-16賽季CBA聯(lián)賽之遼寧
日期:2016-12-15 10:24:1715-16賽季CBA聯(lián)賽之佛山
日期:2016-11-30 09:04:2015-16賽季CBA聯(lián)賽之江蘇
日期:2016-04-29 15:56:1215-16賽季CBA聯(lián)賽之同曦
日期:2016-04-12 13:21:182016猴年福章徽章
日期:2016-02-18 15:30:3415-16賽季CBA聯(lián)賽之山東
日期:2016-02-16 11:37:52每日論壇發(fā)貼之星
日期:2016-02-07 06:20:00程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2016-02-07 06:20:0015-16賽季CBA聯(lián)賽之新疆
日期:2018-01-09 16:25:37
7 [報(bào)告]
發(fā)表于 2016-03-29 15:06 |只看該作者
import multiprocessing

def main():
    pool = multiprocessing.Pool(5)
    old = 0,0
    while 1:
        temp_lists=temp_get()#讀取傳感器的值到一個(gè)list
        temp_avg=get_avg(temp_lists)#計(jì)算溫度平均值
        if (temp_avg>temp_max):
            dis_hot() #若平均值大于設(shè)定上限,則持續(xù)降溫
        elif (temp_avg<temp_min):
            hot() #若平均值小于下限,則持續(xù)加熱
        else:
            keep_warming() #否則保溫(不加熱也不降溫)
        if old == (temp_lists,temp_avg):
            continue
        old = (temp_lists,temp_avg) #控制一下不要做可有可無的調(diào)用
        pool.apply_async(temp_display)
        ##temp_display() #在數(shù)碼管上依次顯示5個(gè)傳感器溫度以及平均溫度,每秒1個(gè),共耗時(shí)6秒

評(píng)分

參與人數(shù) 1信譽(yù)積分 +10 收起 理由
Windows19 + 10

查看全部評(píng)分

論壇徽章:
0
8 [報(bào)告]
發(fā)表于 2016-03-29 19:53 |只看該作者
bskay 發(fā)表于 2016-03-29 15:06
import multiprocessing

def main():
說下這個(gè)思路的幾個(gè)問題
1數(shù)碼管與液晶不同,它是一個(gè)需要不停掃描才能顯示顯示的器件,如果幾個(gè)溫度相同,就不進(jìn)行顯示,數(shù)碼管會(huì)沒有輸出。當(dāng)然1602是可以正常顯示的。  

所以
if old == (temp_lists,temp_avg):
            continue
old = (temp_lists,temp_avg) #控制一下不要做可有可無的調(diào)用
對(duì)數(shù)碼管來說是錯(cuò)誤的,它會(huì)導(dǎo)致數(shù)碼管無顯示。

2.bskay使用了進(jìn)程池,這可以充分利用多核cpu的各個(gè)核心,但bskay開了5個(gè)進(jìn)程,這是沒必要的且是錯(cuò)誤的。主線程的一個(gè)loop是很快的(不加sleep,測(cè)5個(gè)18b20,最多ms級(jí)吧),而顯示進(jìn)程是很慢的,主線程一個(gè)loop下來,就會(huì)有一個(gè)進(jìn)程被產(chǎn)生出來(<=5)基本上瞬間就會(huì)使進(jìn)程池滿掉,造成主線程阻塞。

而且依樓主意思樓主只有一個(gè)數(shù)碼管,是依次做的掃描。btw,你得把數(shù)據(jù)傳進(jìn)去,否則進(jìn)程顯示什么呢?

論壇徽章:
11
2015年迎新春徽章
日期:2015-03-04 09:55:282017金雞報(bào)曉
日期:2017-02-08 10:39:4215-16賽季CBA聯(lián)賽之遼寧
日期:2016-12-15 10:24:1715-16賽季CBA聯(lián)賽之佛山
日期:2016-11-30 09:04:2015-16賽季CBA聯(lián)賽之江蘇
日期:2016-04-29 15:56:1215-16賽季CBA聯(lián)賽之同曦
日期:2016-04-12 13:21:182016猴年福章徽章
日期:2016-02-18 15:30:3415-16賽季CBA聯(lián)賽之山東
日期:2016-02-16 11:37:52每日論壇發(fā)貼之星
日期:2016-02-07 06:20:00程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2016-02-07 06:20:0015-16賽季CBA聯(lián)賽之新疆
日期:2018-01-09 16:25:37
9 [報(bào)告]
發(fā)表于 2016-03-30 11:16 |只看該作者
本帖最后由 bskay 于 2016-03-30 11:29 編輯

回復(fù) 8# amduroncn


主線程一個(gè)loop下來,就會(huì)有一個(gè)進(jìn)程被產(chǎn)生出來(<=5)基本上瞬間就會(huì)使進(jìn)程池滿掉,造成主線程阻塞。

最好先實(shí)地驗(yàn)證一下,驗(yàn)證過是沒有關(guān)系的


if old == (temp_lists,temp_avg):
            continue

只是相同的不去顯示,因?yàn)榍耙淮蔚娘@示過程可能還沒有完成,沒有什么影響(邏輯上肯定沒有問題的,如果長(zhǎng)時(shí)間保持恒溫..做不做都沒有關(guān)系的)

論壇徽章:
0
10 [報(bào)告]
發(fā)表于 2016-03-30 13:33 |只看該作者
回復(fù) 9# bskay


    以前看到apply_async說是池滿了,會(huì)阻塞主線程。實(shí)驗(yàn)了一下不會(huì)。我說錯(cuò)了。這個(gè)方法可行,只要將POOL(1)即可。
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國(guó)互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP