在python中的两个线程之间共享变量

2024-05-02 21:58:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我想使用解释器中的原子操作在两个线程之间共享一个变量,如下所述http://effbot.org/zone/thread-synchronization.htm。核心数据类型的简单赋值(单字节码操作)应该是线程安全的,因为python<;3.2中的GIL就是这样。目前为止的理论。以下代码可以在主模式或从模式(-m或-s)下运行。主模式通过UDP发送数据。从模式创建一个线程,从udp端口读取数据,并在每个接收到的数据包上更新一个变量。

示例代码在创建时确实将共享变量作为参数传递给线程。我也尝试过使用全局变量或将线程本地存储传递给线程。

结果是一样的。在read_time_master线程内,变量被赋值。但在主线程中,共享变量的值不会更新。

#!/usr/bin/env python

import socket
import itertools
import multiprocessing
from optparse import OptionParser
from time import sleep

PORT = 1666

def read_time_master(sock, time_master):
   while True:
     time_master = float(sock.recvfrom(1024)[0])

def main():
    time_master = 0.0
    p = OptionParser()
    p.add_option('--master', '-m', action='store_true')
    p.add_option('--slave', '-s', action='store_true')
    options, arguments = p.parse_args()
    if options.master or options.slave:
        sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, 0)
    if options.master:
        sock.connect(('127.0.0.1', PORT))
    if options.slave:
        sock.bind(('0.0.0.0', PORT))
        recv_thread = multiprocessing.Process(target=read_time_master, args=(sock, time_master))
        recv_thread.start()

    for time in itertools.count():
        print time
        if options.slave:
            print "master: %f" % time_master # -> not updated from other thread
        if options.master:
            try:
                sock.send(str(time))
            except socket.error:
                pass
        sleep(1)

    if options.master or options.slave:
        sock.close()

if __name__ == '__main__':
    main()

Tags: fromimportmasterreadiftimemainport
2条回答

您可以使用共享内存,如下所述http://docs.python.org/2/library/multiprocessing.html#sharing-state-between-processes。请记住,在从共享空间读取之前,请等待进程完成。

你用的是multiprocessing,而不是threading,这对你的情况没有帮助。如果您使用threading.Thread来创建后台工作程序,那么您只需在由后台操作控制的函数中抛出一个global time_master调用,就可能能够获得所需的内容。因为您使用的是multiprocessing,而不是threading,所以可能需要查看multiprocessing.Queue类中的容器,以便在进程之间来回传递信息或同步它们。您还可以创建在进程之间共享的变量(所有这些都在Python Homepagemultiprocessing文档/示例中介绍)

相关问题 更多 >