我正在执行多线程,并尝试将' ,F
'附加到味精(字符串)' pSDATA,0,4,2,2,0,4\n
'中。最终,我想得到' pSDATA,0,4,2,2,0,4,F\n
',但是当我运行以下代码时:
if(msg[0].lower() == 'p'):
msg = msg[:-1] + ',F\n'
pcQueue.put_nowait(msg[1:])
print ("Message received: ") + msg[1:]
我得到以下结果:
,Fssage received: SDATA,0,4,2,2,0,4
我怀疑这是由于多线程。任何帮助将不胜感激!
答案 0 :(得分:1)
如果您尝试使用msg[:-1]
删除尾随换行符,请注意该字符串可能以"\r\n"
结尾。 \r
通常具有返回到输出行的开头并继续在此处写的效果。正确的操作方式取决于您为什么要删除结尾的换行符,但是如果您想从尾部完全删除尾行,可以选择同时支持\r\n
和\n
,这是您可以执行的操作它:
def chomp(s):
if s.endswith('\n'):
if s.endswith('\r\n'):
return s[:-2]
return s[:-1]
return s
⋮
if msg[0].lower() == 'p':
msg = chomp(msg) + ',F\n'
⋮
其他可供选择的内容可能包括msg.rstrip()
,以便从末尾删除所有空白,msg[:-2]
(如果您确定它总是以CR LF结尾,则…)。
此外,如果所涉及的任何协议都指定了CR LF的首选项,或者即使它与您所传递的内容一致,那么您可能想要添加,F\r\n
而不是,F\n
。 / p>
答案 1 :(得分:0)
如果您有多个线程同时打印到控制台,则不能保证打印是原子的。这意味着来自不同线程的消息确实可以在控制台上交错。如果有问题,则应使用同步(http://effbot.org/zone/thread-synchronization.htm)。
另一方面,没有理由认为放入队列中的消息无论如何都已损坏。否则,您需要提供更多详细信息。