![](/img/trans.png)
[英]Python threading lock is condition.acquire similar to lock.acquire
[英]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.