【问题标题】:Thread class will not start or Initialize线程类不会启动或初始化
【发布时间】:2018-09-27 01:59:06
【问题描述】:

我正在尝试创建一个 ZMQ 订阅者,它每隔一定时间写入 CSV(时间并不重要)。

我遇到的问题是我的 write_csv1 类甚至没有启动或初始化,并且我的 ZMQ 线程类的初始化代码是相同的。在我添加 threading.Condition 和 c.acquires/c.release 之前它正在工作。

任何提示或指示都会令人惊叹。

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 write_csv(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()
            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_all()
                    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()

【问题讨论】:

  • 两件事:为了启动一个线程,你不必从线程类派生,就像你不必为了使用文件而从文件类派生一样。其次,您需要阅读How to Ask 并提取minimal reproducible example。提出精确的问题可以帮助您自己发现错误。此外,如果没有 MCVE,您的问题将被视为离题。

标签: python python-3.x multithreading pandas zeromq


【解决方案1】:

问题是你没有在写类上实现run() 方法。 您需要将write_csv(self) 重命名为run(self)

【讨论】:

  • 好的,它运行起来了。但是现在我的 while 循环在我的 write 类中停止在 c.acquire 处。不知道为什么。这是我第一次尝试更复杂的线程技术。有趣的是,我的 ZMQ_thread 类中的 run() 函数就是我最初命名的。所以......运气不好
猜你喜欢
  • 1970-01-01
  • 2016-04-26
  • 2021-06-17
  • 2012-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-28
  • 2011-04-24
相关资源
最近更新 更多