so I take it when you say you are reading once a second, you chose this particular interval because of the number of tags you are trying to read takes about that much time to accomplish? In other words, you have lot of tags to read, you have set the one second interval because of the time it takes to read them and you would like to do it more frequently.
Threading is one way, make parallel connections, obviously that adds some level of complication. Another way to speed things up a bit is to provide the data type. This helps even more when reading lists of tags. For example:
tags = [('tag1', 196), ('tag2', 196), ('tag3', 194)]
where tag1 and tag2 are a DINT, tag3 is a SINT (you can get the values from self.CIPTypes)
So when you provide the data type, pylogix won't have to retrieve the data type of each new tag. There is obvious room for improvement here, most people in the PLC world refer to the data type DINT as a DINT rather than 196 (or 0xc4). I have a balance I have to strike between CS types and controls types....