簡體   English   中英

線程條件“獲取鎖”實際上並未獲取該鎖

[英]Threading Condition Acquire lock is not actually acquiring the lock

我正在嘗試創建一個ZMQ訂閱服務器,該訂閱服務器每隔一定的時間寫入CSV文件(時間無關緊要)

我遇到的問題是在我的寫作課上。 當我運行c.acquire來獲取鎖時,它什么也不做,並且循環只是凍結了

ZMQ_Thread類中的c.acquire實際上正在工作,所以我不確定我在做什么錯。

任何指示或技巧將是驚人的。 提前致謝。

import zmq
import pandas as pd
import time
import threading


c = threading.Condition()
df = pd.DataFrame()
s = 0
m = 0
h = 0
d = 0

def counter():
    global h,s,m,d
    while True:
        s += 1
        print("Second:{}".format(s))
        if s >=60:
            m +=1
            s = 0
        if m >= 60:
            h += 1
            m = 0
        if h >= 24:
            d += 1
            h = 0        
        time.sleep(1)

class write(threading.Thread):
    def __init__(self,name):
        threading.Thread.__init__(self)
        self.name = name
    def run(self):
        global df
        while True:            
            print('sleeping')            
            time.sleep(12)
            c.acquire()
            print('acquired')
            print(df)                 
            with open("FILE", 'a') as f:
                    df.to_csv(f, encoding = 'utf-8', index = False, header = False)
            c.release()
            c.notify()
            z = zmq_thread()            
            z.run()        

class zmq_thread(threading.Thread):
    def __init__(self,name):
        threading.Thread.__init__(self)
        self.name = name
    def run(self):  
        global df
        print('DF Created')
        context = zmq.Context()
        socket = context.socket(zmq.SUB)      
        socket.connect("tcp://localhost:#####")
        socket.setsockopt_string(zmq.SUBSCRIBE, 'TOPIC') 
        print('socket connected')

        count = 0
        while True: 
            c.acquire()
            try:
                count +=1
                if count == 10:
                    print('ZMQ Break') 
                    c.notify()
                    c.release()
                    print('Lock released')
                    return df                
                message = socket.recv_string()
                message2 = socket.recv_string()        
                if message == 'TOPIC':
                    message2_split = message2.split(",")
                    message4 = pd.Series(message2_split)
                    df = df.append(message4, ignore_index=True)               
                    print('ZMQ Running')

            except KeyboardInterrupt:
                break              



counter = threading.Thread(target = counter)
write_csv1 = write("Write_csv")
zmq_loop = zmq_thread('Start_ZMQ')    

counter.start()
write_csv1.start()    
zmq_loop.start()

答案是,我沒有調用c.wait()。 這是我在c.notify()所在的位置添加了c.wait()的代碼片段。 它等待下一個進程獲取鎖,然后啟動write_csv類。

while True: 
            c.acquire()
            try:
                count +=1
                if count == 10:
                    print('ZMQ Break') 
                    c.wait()                                      
                message = socket.recv_string()
                message2 = socket.recv_string()        
                if message == 'TOPIC':
                    message2_split = message2.split(",")
                    message4 = pd.Series(message2_split)
                    df = df.append(message4, ignore_index=True)               
                    print('ZMQ Running')

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM