2015-02-04 2 views
1

У меня есть следующий скрипт, и я пытаюсь сделать его асинхронным. Он отлично работает в качестве клиента для подключения через TCP и отправки текстового файла. Тем не менее, я выполняю его из другой программы, и это замедляет программу, из которой я ее запускаю (отсюда и необходимость async). Моя цель - заставить скрипт работать в своем фоновом потоке, чтобы он не влиял на исполняемую программу.Сделать асинхронный сокет python?

Я попытался добавить asyncore, но я просто продолжаю получать ошибки и, похоже, не свяжусь. Я также пробовал потоки, но не могу заставить это работать. Был бы признателен за любые указания относительно того, как сделать это асинхронным

Ive попытался использовать учебник здесь - 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) 
+0

Резьба действительно способ пойти на это. – MeetTitan

ответ

1

Нитки были бы подходом, который я использовал бы. Попробуйте следующее:

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

Hi MeetTitan, извините, мой Python немного базовый, просто интересно, куда это может пойти в скрипте? Как я могу это реализовать? Я предполагаю, что мне нужно объявить потоки сверху тоже? –

+0

Замените ваш вызов 'sendtextfile.Send (datasend)' в своей функции 'main()' с моим фрагментом, и ваша функция будет выполняться асинхронно. Да, не забудьте также импортировать 'Threading'. – MeetTitan

+0

Хммм, переменная Im fill is bytes_sent, а не «thread», когда я меняю ее на «thread», она не работает должным образом с классом? –

Смежные вопросы