使python套接字异步吗?

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

我尝试添加异步,但我一直在收到错误,而且似乎无法连接。我也尝试过线程化,但也无法使其正常工作。将感谢任何有关如何使此异步的指针

香港专业教育学院尝试在这里使用该教程-http: //www.mechanicalcat.net/richard/log/Python/A_simple_asyncore__echo_server__example但是,他们的脚本架构是如此不同,以至于我似乎无法将其合并到我的脚本中。

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)
遇见泰坦

线程将是我将使用的方法。试试这个:

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章