[d]求助:python中线程切换和执行时间的问题

时间:2021-05-01 18:11:39
最近需要用做一个网络客户端,实现数据输入并发送,接收数据并保存
我是这样做的,创建socket并连接后,在主程序里用recv函数接收数据
while True:
    data = socket.recv(...)
    #之后进行数据验证和保存
数据发送的功能我又创建了一个线程来完成
#线程函数
def senddata():
    a = input()
    #....
    send(a)
线程是在主程序中创建的
t1 = threading.Thread(senddata)
t1.start()
问题是,无论是input()还是recv()都是阻塞函数,会一直等待数据输入或接受,但是什么时候要发数据或接收数据是不确定的,我做了一些实验,发现不能正确接到数据,发送也有点问题。
python不是自动分配各个线程运行时间么?怎么控制时间保证两个函数都能正确运行啊?谢谢各位高手!!!
    
--------------------------
Double行动:
原帖分数:100

12 个解决方案

#1


你希望的“正确”运行是什么?“不能正确接到数据”指什么?

#2


引用 1 楼  的回复:
你希望的“正确”运行是什么?“不能正确接到数据”指什么?

不能正确接到数据的现象就是我用服务器端给我的客户端程序发送数据时,客户端不能正常接收和显示。比如在服务器端发送"data1 from server",这时候我的程序那边不会有任何显示,我在客户端输入一个字符串再回车发送给服务端,这时候客户端才会显示刚才服务端发给他的数据"data1 from server"。也就是服务端发完数据后客户端不能实时收到,是不是因为程序一直阻塞在线程t1的input()那里,recv函数不能运行呢?这个应该怎么解决?

#3


input()--当然会因此而阻塞

#4


引用 3 楼  的回复:
input()--当然会因此而阻塞

那我想实现这种功能,运行过程中通过recv接收数据,同时需要的时候还可以输入数据以发送,应该怎么实现啊?谢谢

#5


是不是这样可以:我开两个线程A和B,A线程负责等待将要发送的数据输入,若有输入则设标志位,B线程负责等待receive,若收到数据则设标志位,主程序负责不断侦测相应的标志位来发送数据或存储数据。
#A线程的函数
def A():
    ....
    a = input()
    send_flag = 1
#B线程的函数
def B():
    ....
    b = recv(1024)
    recv_flag = 1
#main中
while True:
    if(send_flag == 1):
         socket.send(a)
    if(recv_flag == 1):
         print (data)
         #存储
如果不行的话应该怎么实现这种功能啊,求高手指教!谢谢!

#6


继续在线求助

#7


上面那个方法貌似不可以...具体怎么实现也不知道

#8


引用 4 楼  的回复:
引用 3 楼 的回复:
input()--当然会因此而阻塞

那我想实现这种功能,运行过程中通过recv接收数据,同时需要的时候还可以输入数据以发送,应该怎么实现啊?谢谢

交互式一样的嘛?
你可以每次都是先接收数据,
接收完之后,在输入请求,在发送请求,循环。。

#9


貌似 python 线程有全局锁

#10


引用 8 楼  的回复:
引用 4 楼 的回复:
引用 3 楼 的回复:
input()--当然会因此而阻塞

那我想实现这种功能,运行过程中通过recv接收数据,同时需要的时候还可以输入数据以发送,应该怎么实现啊?谢谢

交互式一样的嘛?
你可以每次都是先接收数据,
接收完之后,在输入请求,在发送请求,循环。。

可是发送和接收数据不一定按顺序来的,可能不定期的会收到数据,发送数据也是不定期的,这样的话怎么才能实现啊?

#11


引用 9 楼  的回复:
貌似 python 线程有全局锁

查了下资料,挺复杂的,但看资料说input()调用的时候应该会自动释放全局锁的啊,在程序里看起来不是...有没有什么办法呢?

#12


遇到了同样的问题

#1


你希望的“正确”运行是什么?“不能正确接到数据”指什么?

#2


引用 1 楼  的回复:
你希望的“正确”运行是什么?“不能正确接到数据”指什么?

不能正确接到数据的现象就是我用服务器端给我的客户端程序发送数据时,客户端不能正常接收和显示。比如在服务器端发送"data1 from server",这时候我的程序那边不会有任何显示,我在客户端输入一个字符串再回车发送给服务端,这时候客户端才会显示刚才服务端发给他的数据"data1 from server"。也就是服务端发完数据后客户端不能实时收到,是不是因为程序一直阻塞在线程t1的input()那里,recv函数不能运行呢?这个应该怎么解决?

#3


input()--当然会因此而阻塞

#4


引用 3 楼  的回复:
input()--当然会因此而阻塞

那我想实现这种功能,运行过程中通过recv接收数据,同时需要的时候还可以输入数据以发送,应该怎么实现啊?谢谢

#5


是不是这样可以:我开两个线程A和B,A线程负责等待将要发送的数据输入,若有输入则设标志位,B线程负责等待receive,若收到数据则设标志位,主程序负责不断侦测相应的标志位来发送数据或存储数据。
#A线程的函数
def A():
    ....
    a = input()
    send_flag = 1
#B线程的函数
def B():
    ....
    b = recv(1024)
    recv_flag = 1
#main中
while True:
    if(send_flag == 1):
         socket.send(a)
    if(recv_flag == 1):
         print (data)
         #存储
如果不行的话应该怎么实现这种功能啊,求高手指教!谢谢!

#6


继续在线求助

#7


上面那个方法貌似不可以...具体怎么实现也不知道

#8


引用 4 楼  的回复:
引用 3 楼 的回复:
input()--当然会因此而阻塞

那我想实现这种功能,运行过程中通过recv接收数据,同时需要的时候还可以输入数据以发送,应该怎么实现啊?谢谢

交互式一样的嘛?
你可以每次都是先接收数据,
接收完之后,在输入请求,在发送请求,循环。。

#9


貌似 python 线程有全局锁

#10


引用 8 楼  的回复:
引用 4 楼 的回复:
引用 3 楼 的回复:
input()--当然会因此而阻塞

那我想实现这种功能,运行过程中通过recv接收数据,同时需要的时候还可以输入数据以发送,应该怎么实现啊?谢谢

交互式一样的嘛?
你可以每次都是先接收数据,
接收完之后,在输入请求,在发送请求,循环。。

可是发送和接收数据不一定按顺序来的,可能不定期的会收到数据,发送数据也是不定期的,这样的话怎么才能实现啊?

#11


引用 9 楼  的回复:
貌似 python 线程有全局锁

查了下资料,挺复杂的,但看资料说input()调用的时候应该会自动释放全局锁的啊,在程序里看起来不是...有没有什么办法呢?

#12


遇到了同样的问题