我试图让线程与Socket网络一起接受客户端。我工作得很好,但现在我发现了一个问题。
以下是代码:
clients = []
def myFunction(): #Not too relevant I think
server.listen(0)
conn, addr = server.accept()
print(conn)
clients.append(conn, addr)
threading.Thread(myFunction)
threading.Thread(myFunction)
input("Hit enter to finish...")
print(clients)
现在这应该返回这样的东西,它在我尝试过的所有IDE上都有(PyCharm,Sublime文本编辑器等):
Hit enter to finish...
*2 users connect*
192.168.0.5 # this is the contents of conn
192.168.0.12
*hit enter*
192.168.0.5, 192.168.0.12
然而,在Python自己的IDLE中,线程似乎无法打印任何内容,直到我按Enter键,使用完全相同的代码,如下所示:
Hit enter to finish...
*2 users connect*
*hit enter*
192.168.0.5
192.168.0.12
192.168.0.5, 192.168.0.12
这不是我想要的,因为我的代码一旦完成就会在Python IDLE中运行,所以它需要在这里工作。
TLDR:
代码在Python IDLE中的运行方式与在其他IDE中运行的代码完全相同。请参阅上面的代码示例。
答案 0 :(得分:0)
正如IDLE的名字所暗示的那样,它主要是一个开发(和学习)环境。它特别针对初学者。用于运行完成的代码最多是次要的,通常不是优势。
IDLE Doc chapter,可以使用Help =>在IDLE中查看IDLE Help,有一个子段(3.3)IDLE-console差异。它开始
除了极少数例外,使用IDLE执行Python代码的结果与在控制台窗口中执行相同代码的结果相同。但是,不同的界面和操作偶尔会影响可见结果。
操作的最大区别在于您的代码在单独的Python进程中执行,标准输入和输出通过套接字连接。这意味着程序中的所有stdout输出都会通过IDLE代码,该代码将其插入到tk Text小部件中,而不是直接发送到OS屏幕管理器。
在input()的情况下,IDLE在用户返回之前停止显示输出。 (即使是空提示也是如此。)我认为这是对用户输入中间输出分散的改进。您的代码无法按原样运行,但以下情况可以运行。
导入线程,时间
def myFunction():
time.sleep(1)
print('Interruption from thread')
thread = threading.Thread(target=myFunction)
thread.start()
s =input("Hit enter to finish...")
print(s)
在Win10上的IDLE 3.7.0b3中,我看到类似
的内容Hit enter to finish...skjfsjflsjfljsflsfjls
Interruption from threadskjfsjflsjfljsflsfjls
(我不知道为什么' \ n'之后'线程'被抑制。) 在命令提示符中,我看到
Hit enter to finish...ksjfkjsInterruption from thread
fjsfjsfkjsfljksfjkfs
ksjfkjsfjsfjsfkjsfljksfjkfs
在>>>
:之后输入代码时出现同样的问题。将我的代码更改为
import threading, time
def myFunction():
time.sleep(2)
print('Interruption from thread')
thread = threading.Thread(target=myFunction)
thread.start()
IDLE:
>>> Interruption from thread
if a = 3:
在命令提示符中以相同的时间输入相同的标题:
C:\Users\Terry>python -i -m a.tem
>>> if aInterruption from thread
= 3
如果我更好地理解相关的IDLE代码,我会在提示之前插入一行中断行。我也可能在input()期间也这样做。幸运的是,线程或异步任务的输出并不常见,特别是对于初学者。