使python套接字异步?

使python套接字异步?,python,asynchronous,python-multithreading,asyncore,Python,Asynchronous,Python Multithreading,Asyncore,我有下面的脚本,我正在尝试使它异步。作为客户端,它可以通过TCP连接并发送文本文件。但是,我正在从另一个软件程序执行它,这会减慢运行它的程序的速度(因此需要异步)。我的目标是让脚本在它自己的后台线程中运行,这样它就不会影响正在执行的程序 我已经尝试添加asyncore,但我只是不断出现错误,它似乎无法连接。我也试过穿线,但也不能让它工作。如果您有任何关于如何使其异步的建议,我将不胜感激 我试过在这里使用教程,但是,他们脚本的架构与我的非常不同,我似乎无法将其纳入我的脚本中 import sock

我有下面的脚本,我正在尝试使它异步。作为客户端,它可以通过TCP连接并发送文本文件。但是,我正在从另一个软件程序执行它,这会减慢运行它的程序的速度(因此需要异步)。我的目标是让脚本在它自己的后台线程中运行,这样它就不会影响正在执行的程序

我已经尝试添加asyncore,但我只是不断出现错误,它似乎无法连接。我也试过穿线,但也不能让它工作。如果您有任何关于如何使其异步的建议,我将不胜感激

我试过在这里使用教程,但是,他们脚本的架构与我的非常不同,我似乎无法将其纳入我的脚本中

import socket
import struct
import sys
import os
import time
import os.path

_MAX_BLOCK_SIZE = 1448
_PORT = 8002
IP_ADDRESS = '192.168.1.5'
FILE = sys.path[0] + "/MyFile.txt"

class FileSender(object):

  def __init__(self, host):
    self.__host = IP_ADDRESS

  def __Pad(self, buf):
    """Returns copy of buf padded with NULLs to make its length a multiple of 4 bytes."""

    if len(buf) % 4 == 0:
      return buf

    pad_buf = ""
    for i in range(4 - (len(buf) % 4)):
      pad_buf += "\x00"

    return buf + pad_buf
  def __FormatInt(self, int):

    """Returns string containing 32-bit integer in network byte order."""
    return struct.pack("!i", int)

  def Send(self, buf):

    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    s.connect((self.__host, _PORT))

    padded_buf = self.__Pad(buf) 

    # Send header packet.
    s.send("%s%s%s%s" % (self.__FormatInt(16 + len(padded_buf)),
                         self.__Pad("/txtl"),
                         self.__Pad(",b"),
                         self.__FormatInt(len(buf))))

    # Send data packets.
    bytes_sent = 0
    while (bytes_sent < len(padded_buf)):
      bytes_to_send = len(padded_buf) - bytes_sent
      assert bytes_to_send % 4 == 0
      bytes_this_block = min(_MAX_BLOCK_SIZE, bytes_to_send)
      s.send(padded_buf[bytes_sent:(bytes_sent + bytes_this_block)])
      bytes_sent += bytes_this_block

    s.close()
    return bytes_sent

def main(argv):

  sendtextfile = FileSender(IP_ADDRESS)

  # Read input data.
  input_file = open(_FILE)
  data = input_file.read().strip()
  input_file.close()
  datasend = data[:-7]

  bytes_sent = sendtextfile.Send(datasend)

if __name__ == "__main__":
  main(sys.argv)
导入套接字
导入结构
导入系统
导入操作系统
导入时间
导入操作系统路径
_最大块大小=1448
_端口=8002
IP_地址='192.168.1.5'
FILE=sys.path[0]+“/MyFile.txt”
类FileSender(对象):
定义初始化(自,主机):
self.\uuuu主机=IP地址
def___垫(自身,buf):
“”“返回用NULL填充的buf副本,使其长度为4字节的倍数。”“”
如果len(buf)%4==0:
返回buf
pad_buf=“”
对于范围(4-(len(buf)%4))内的i:
pad_buf+=“\x00”
返回buf+pad_buf
定义格式int(self,int):
“”“返回包含网络字节顺序的32位整数的字符串。”“”
返回结构包(“!i”,int)
def发送(自身,buf):
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s、 setsockopt(socket.SOL_socket,socket.SO_REUSEADDR,1)
s、 连接((自身、主机、端口))
填充垫=自身。填充垫(buf)
#发送头数据包。
s、 发送(“%s%s%s%s”%(self.\u FormatInt(16+len(padded\u buf)),
自我保护垫(“/txtl”),
自焊盘(“,b”),
self.\uu FormatInt(len(buf)))
#发送数据包。
发送的字节数=0
而(发送的字节数
线程将是我将使用的方法。 试试这个:

thread = threading.Thread(target = sendtextfile.Send, args = (datasend,))
thread.start()

线程确实是实现这一点的方法。嗨,MeetTitan,对不起,我的Python有点基础,只是想知道这可能会在脚本中出现在哪里?我可以如何实现它?我猜我也需要在顶部声明线程?用我的代码片段替换
main()
函数中对
sendtextfile.Send(datasend)
的调用,函数将异步运行。是的,记住也要导入
线程化
。Hmmn,变量Im filling是bytes_sent而不是“thread”,当我将其更改为“thread”时,它不能与类正常工作?@Ke.,您需要
bytes_sent
?您可以将其设置为线程和主函数范围内的变量,以访问发送的
字节
。但是我看不到您在哪里使用
bytes\u sent
,我也不明白为什么代码段不能工作。对“bytes\u sent=sendtextfile.Send(datasend)”的调用被放入变量“bytes\u sent”,然后我返回FileSender类中发送的字节。我试过使用“thread=threading.thread(bytes\u sent=sendtextfile.Send,args=(datasend,)”,但这似乎不起作用。