为了账号安全,请及时绑定邮箱和手机立即绑定

Python:如何在网络中使用线程?

Python:如何在网络中使用线程?

慕妹3146593 2021-03-19 14:10:17
我正在尝试制作一个程序,该程序将搜索随机ID来查找网站标题。我做了一个单线程函数,但是它非常慢,因为如果没有随机IP的服务器,它必须等待超时。我不了解线程,有人可以帮助我吗?关于线程有什么好的教程吗?也许是一个有关如何使ips主线程和另外几个线程检查ips的示例。
查看完整描述

3 回答

?
慕慕森

TA贡献1856条经验 获得超17个赞

我输入了一个非常简单的示例,希望它对您来说是一个很好的入门者:


# 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",))

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


如果您使用全局变量解决方案,则添加了锁。在并发编程中,当多个线程希望同时访问同一资源时,可能会发生“竞赛条件”。为了防止覆盖这些变量的旧状态,锁可以保护该资源。仅在释放锁定之后,才允许下一个线程访问资源。等待发布会在这里为您服务:)


我希望这有帮助 :)


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


while True:

    lock2.acquire()

    if counter == totalthreads: # in this case 3

        lock2.release()

        break

    lock2.release()

print "Done! %r" % myresults


查看完整回答
反对 回复 2021-03-30
?
繁星点点滴滴

TA贡献1803条经验 获得超3个赞

好的,所以基本上您想运行一个产生几个线程的脚本,每个线程都尝试到达一个IP,对吗?


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


import threading

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

thread.start()

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


线程如何将其结果报告回主线程有几种方法。我猜想这应该是一个不会经常使用的简单脚本,所以为什么不简单地使用dict,将ips作为键,将结果作为值。


查看完整回答
反对 回复 2021-03-30
  • 3 回答
  • 0 关注
  • 192 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号