【问题标题】:Python: How to use threads in network?Python:如何在网络中使用线程?
【发布时间】:2013-06-05 14:27:28
【问题描述】:

我正在尝试制作一个搜索随机 id 的程序 网站标题。我做了一个单线程函数,但它超级慢 因为如果随机没有服务器它必须等待超时 ip。我对线程一无所知,有人可以帮助我吗?任何好的 线程教程?或者也许是一个关于如何拥有一个主线程的例子 ips 和另外几个线程检查 ips。

任何帮助表示赞赏。谢谢

【问题讨论】:

  • 你能不能加一些代码,这样对你有帮助。
  • 我有一个方法 generateIp 返回公共 id 并检查哪个获取该 ip 并返回标题标签的内容

标签: python multithreading networking


【解决方案1】:

我打了一个非常简单的例子,希望它对你来说是一个很好的开始:

# this is important
from thread import start_new_thread, allocate_lock

# this is for show
from time import sleep
from random import randint

# global receiver
myresults = []
counter = 0

# lock that protects "myresults"
lock = allocate_lock()

#lock that protects "counter"
lock2 = allocate_lock()

# this does the url processing
def retrieve(url):
    # sleep for 4-10s to simulate processing time
    sleep(randint(4,10))
    print "Done handling %s" % url

# thread safe retrieve
def retrieveLocking(url):
    // global variables
    global myresults, counter

    // random processing time
    sleep(randint(4,10))
    print "[LOCKING] Done handling %s" % url

    // request access to myresults' lock
    lock.acquire()
    myresults.append(url)
    lock.release() // release lock!

    // request access to counter's lock
    lock2.acquire()
    counter += 1
    lock2.release() // release lock!

# here goes your main loop
start_new_thread(retrieve, ("A",))
start_new_thread(retrieve, ("B",))
start_new_thread(retrieve, ("C",))

# using locking
start_new_thread(retrieveLocking, ("A",))
start_new_thread(retrieveLocking, ("B",))
start_new_thread(retrieveLocking, ("C",))

在这种情况下,可以通过全局变量来处理查询结果。还有更复杂的方法可以从线程中检索数据。

如果您使用全局变量解决方案,我添加了锁。在并发编程中,当多个线程想要同时访问同一个资源时,可能会出现“竞争条件”。为了防止覆盖这些变量的旧状态,锁可以保护该资源。只有在锁被释放后,才允许下一个线程访问该资源。等待发布在这里为您处理:)

我希望这会有所帮助:)

// 编辑: 如果您以这种方式解决您的问题,那么实际上并没有办法确定所有线程是否都终止了。因此,如果您想坚持这个解决方案,请添加一个由每个线程增加的计数器(用锁保护计数器)并执行忙等待(无限循环,直到达到计数器)。这确实是不好的做法。但是,如果您想更精细地编写代码,事情会变得有点复杂,我假设您是并发编程的新手:

while True:
    lock2.acquire()
    if counter == totalthreads: # in this case 3
        lock2.release()
        break
    lock2.release()
print "Done! %r" % myresults

【讨论】:

  • 好的,我如何让它无限?只要回答这个问题,你就会得到最好的答案。请我不明白线程
  • 当你知道你将产生多少线程时,添加一个全局计数器。每当一个线程完成处理时(比如当它准备好追加到列表并获取锁时),增加该计数器。在代码循环结束时,直到达到计数。但我想再次提一下,这很容易但不好的做法 :)
【解决方案2】:

好吧,基本上你想要一个脚本运行,它产生几个线程,每个线程都试图到达一个 ip 对吗?

产生一个线程真的很容易:

import threading
thread = threading.Thread(target=target_function, args(argument1, argument2,...))  
thread.start()

在这种情况下,target_function 应该是您的 ip 检查函数。

线程可以通过多种方式将其结果报告回主线程。我猜这应该是一个不会经常使用的简单脚本,所以为什么不简单地使用一个字典,你使用 ips 作为键,结果作为值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-10
    • 1970-01-01
    相关资源
    最近更新 更多