【问题标题】:How do uniquely identify each client thread among the rest in Python如何在 Python 中唯一标识每个客户端线程
【发布时间】:2019-03-24 20:00:11
【问题描述】:

我找不到唯一标识在服务器上创建和保存的每个线程的方法。每个客户端线程都必须存储自己的信息,这些信息用于将信息中继回其各自的客户端。省略了服务器创建的明显细节:

import sys
from threading import Thread
import socket
import traceback


def client_thread(conn, ip, port, MAX_BUFFER_SIZE = 4096):
    while 1:
    # the input is in bytes, so decode it
        input_from_client_bytes = conn.recv(MAX_BUFFER_SIZE)
            if not input_from_client_bytes:
                break

        # decode input and strip the end of line
        input_from_client = input_from_client_bytes.decode("utf8").rstrip()
        aString = ''
        if (input_from_client.startswith('LOAD BOARD')):
            array = input_from_client.split('~')
            aString = array[1]
        vysl = aString.encode("utf8")  # encode the result string
        conn.sendall(vysl)  # send it to client
    conn.close()  # close connection
    print('Connection ' + ip + ':' + port + " ended")

    while True:
        conn, addr = soc.accept()
        ip, port = str(addr[0]), str(addr[1])
        print('Accepting connection from ' + ip + ':' + port)

        try:
            Thread(target=client_thread, args=(conn, ip, port)).start()
        except:
            traceback.print_exc()
    soc.close()

start_server() 

我读到的一个建议是创建一个 python 文件并在其中添加所有变量并将其导入服务器,但是所有其他线程同时编辑这些值,事情会变得很奇怪。每个线程都希望使用服务器将提供的方法。由于无法在一个类的方法和另一个类的方法之间交换数据,那么最好的方法是什么?

【问题讨论】:

  • 我开始回答,但后来意识到,你打算如何使用线程ID?
  • 您始终可以使用thread.get_ident()(Python 3.3+:threading.get_ident())识别当前线程,然后使用 ID 作为共享字典中的键,以确保您正在访问仅限当前线程。

标签: python multithreading identify


【解决方案1】:

您可以使用name 参数为您的线程命名:

Thread(target=client_thread, args=(conn, ip, port), name=str(ip) + ":" + str(port)).start()

【讨论】:

  • 那么我如何为每个客户端线程分配唯一的变量?我是否创建一个名为 str(ip) + ":" + str(port) 的文本文件,并通过读取和写入文件来更新“变量”?
  • @Jeff - 你为什么要写任何与文件相关的线程?将您的数据保存在工作内存中,因为没有线程本身,线程数据持久性毫无意义。一旦你的线程死了,你将没有任何可行的方法将另一个线程链接到已经存储的数据,除非你传回和转发一些标识符(即会话令牌或类似的),如果你正在传递这样的标识符,那么使用这些标识符来访问存储数据,不用担心线程名称/ID。
  • 我问的原因是因为不同的python文件将具有需要在客户端线程方法中保存变量的方法。除了让文本文件中的其他 python 文件可编辑数据之外,我认为没有办法“伸出援手”。我仍然不知道如何让客户端线程中的变量在方法之间移动,并像 Java 提供的那样返回值。
  • 我很难弄清楚您在寻找什么。您试图在 python 中复制的 Java 正在做什么?或者你只是在 python 中寻找类和对象(它有)?
  • @Jeff - 创建一个模块,比如shared_data,并将您希望从其他模块访问的任何内容放在它的根目录中。然后您可以在任何其他模块中导入您的模块并访问共享数据。当然,这只能在单个进程中工作,但是线程不能在进程之间共享,所以这不应该是一个问题。
猜你喜欢
  • 1970-01-01
  • 2014-09-11
  • 1970-01-01
  • 2011-06-04
  • 2017-02-09
  • 1970-01-01
  • 2015-12-19
  • 2011-04-21
  • 2022-11-02
相关资源
最近更新 更多