2014-01-10 120 views
3

我知道不可能在Python中同時運行多個循環。無論如何,我需要實現的是我有一個循環運行讀取傳感器數據的負載,每0.25秒。 同時我有信號設備並行運行,需要每3秒發送一次信號。 我的問題是通過哪種方式實現這一目標?Python多個循環在同一時間

編寫兩個腳本並行運行它們有意義嗎? 使用線程是否有意義? 有沒有其他的可能性,以使這項工作?

我對代碼示例非常感興趣。

謝謝!

編輯: 兩個循環都是完全獨立的。 因此,假設腳本1正在運行,讀取傳感器數據,當其中一個傳感器收到值< 300時,它應該運行腳本2,它將發送信號。在傳感器數據> 300的同時,它應該停止腳本2.

+0

您可以使用按時間排序的操作的優先級隊列在一個循環中執行所有操作。在循環中,彈出一個項目,等到它的時間到期,執行它的操作,然後在3秒或25秒後安排一個新的項目。 –

+0

你如何檢查這些循環中的時間間隔?那些讀取和發送阻止循環?最簡單的選擇是嘗試每12個讀取傳感器數據一次發送一個「發送信號」。 –

+0

研究Python的'線程' - 當然可以同時運行多個循環。 – jayelm

回答

6

「Python多個循環在同一時間,我知道這是不可能的[...]」 - 這看起來很有趣。

可以同時運行兩個循環,完全如何描述它。這兩種方式都很有意義,取決於你實際需要和想要的東西。如果任務完全獨立,則應將其作爲兩個腳本運行。如果你需要這兩個循環來實現一個任務,並且它們在一個文件中是有意義的,你可以使用multiprocessing

測試python 2.7.5+和3.3.2+。

下面是一些小例子:

from multiprocessing import Process 
import time 

def f(name): 
    print('hello', name) 
    time.sleep(10) 

def d(name): 
    print('test2', name) 
    time.sleep(10) 

if __name__ == '__main__': 
    p1 = Process(target=f, args=('bob',)) 
    p2 = Process(target=d, args=('alice',)) 
    p1.start() 
    p2.start() 
    p1.join() 
    p2.join() 

腳本運行10秒和兩個字符串被打印向右走,這意味着一切正常。

time python3 ./process.py 
hello bob 
test2 alice 

real 0m10.073s 
user 0m0.040s 
sys 0m0.016s 
+0

對不起,我的英語不好:) 這些循環是獨立的,請參閱我的問題編輯。 – Daniel

+0

那麼如果解決方案看起來如果這些任務完全獨立,我想將它作爲兩個腳本運行,那麼該如何解決呢? – Daniel

+0

將'f()'放入'f.py'後臺運行,並將'd()'放入'd.py'並在後臺運行。從您的描述中,腳本不必交流,只需繼續運行即可。沒有什麼更多了。您必須瞭解如何在您的系統上運行bg中的任務,但它是單獨的獨立問題。 – luk32

0

也可以通過運行多個腳本和一些作爲.pyw爲了方便,讓他們通過UDP套接字交換信息。注意127.0.0.1將在任何情況下發送給您自己。另外,對於端口,只要確保沒有其他程序使用您使用的端口。與其他程序一樣,我的意思是任何使用端口或甚至基本路由器設置的程序。

樣品(發送)

import os 
from sockets import * 
host = "ip" 
port = "9000" 
addr = (host, port) 
UDPSock = socket(AF_INET, SOCK_DGRAM) 
data = "Random Text" 
send = data.encode("ascii") 
UDPSock.sendto(send, addr) 
UDPSock.close() 

樣品(接收)

import os 
from socket import * 
host = "" 
port = 9000 
addr = (host, port) 
UDPSock = socket(AF_INET, SOCK_DGRAM) 
UDPSock.bind(addr) 
(data, addr) = UDPSock.recvfrom(1024)#1024 is MAX bytes to receive 
data = data.decode('ascii') 
UDPSock.close() 

您可以使用這些單獨運行循環,並告訴如何從兩個單獨的程序做的。