многопоточное соединение Python через почтовый ящик - PullRequest
0 голосов
/ 02 июня 2018

Я хочу сделать приложения с 10 потоками, которые обмениваются сообщениями 2 на 2 по почтовому ящику.Один поток записывает сообщение в файл, другой читает его.Желаемый вывод:

Thread  1 writes message: Q to file:  testfile.txt !
Thread  2 : Q
Thread  3 writes message: Q to file:  testfile.txt !
Thread  4 : Q
Thread  5 writes message: Q to file:  testfile.txt !
Thread  6 : Q
Thread  7 writes message: Q to file:  testfile.txt !
Thread  8 : Q
Thread  9 writes message: Q to file:  testfile.txt !
Thread  10 : Q

Но это не работает.ОШИБКА:

TypeError: read() argument after * must be an iterable, not int

Что я могу сделать, чтобы решить мою проблему?Мой код:

# -*- coding: utf-8 -*-
import threading
import time    


def write(message, i):
    print "Thread  %d writes message: %s to file:  %s !" % (i, 'Q', 'testfile.txt')     
    file = open("testfile.txt","w")
    file.write(message)
    file.close()
    return


def read(i):
    with open("testfile.txt", 'r') as fin:
            msg = fin.read()
    print "Thread  %d : %s \n" % (i, msg)
    return


while 1:
    for i in range(5):
        t1 = threading.Thread(target=write, args=("Q", int(2*i-1)))
        t1.start()

        time.sleep(0.2)

        t2 = threading.Thread(target=read, args=(int(2*i)))
        t2.start()

        time.sleep(0.5)

1 Ответ

0 голосов
/ 02 июня 2018

Я изменил две вещи внутри цикла while:

1) Если вы хотите, чтобы первый поток был Thread 1, 2i + 1 и 2i + 2 должны быть пропущены

2) Если выЕсли вы хотите передать параметры в функцию, вы должны передать итерируемый тип данных.Просто поставьте запятую после int(2*i+2).

while 1:
    for i in range(5):
        t1 = threading.Thread(target=write, args=("Q", int(2*i+1)))
        t1.start()
        t1.join()
        time.sleep(0.5)

        t2 = threading.Thread(target=read, args=(int(2*i+2),))
        t2.start()
        t2.join()
        time.sleep(0.5)

Вывод:

Thread  1 writes message: Q to file:  testfile.txt !
Thread  2 : Q

Thread  3 writes message: Q to file:  testfile.txt !
Thread  4 : Q

Thread  5 writes message: Q to file:  testfile.txt !
Thread  6 : Q

Thread  7 writes message: Q to file:  testfile.txt !
Thread  8 : Q

Thread  9 writes message: Q to file:  testfile.txt !
Thread  10 : Q
...