Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python中的线程没有';不能平行发生_Python_Multithreading - Fatal编程技术网

python中的线程没有';不能平行发生

python中的线程没有';不能平行发生,python,multithreading,Python,Multithreading,我正在使用urllib2进行数据抓取调用,但每个调用大约需要1秒钟才能完成。我试图测试是否可以将URL调用循环多线程化到具有不同偏移量的线程中 我现在使用update_items()方法执行此操作,其中第一个和第二个参数是偏移量和限制执行循环: import threading t1 = threading.Thread(target=trade.update_items(1, 100)) t2 = threading.Thread(target=trade.update_items(101,

我正在使用urllib2进行数据抓取调用,但每个调用大约需要1秒钟才能完成。我试图测试是否可以将URL调用循环多线程化到具有不同偏移量的线程中

我现在使用update_items()方法执行此操作,其中第一个和第二个参数是偏移量和限制执行循环:

import threading
t1 = threading.Thread(target=trade.update_items(1, 100))
t2 = threading.Thread(target=trade.update_items(101, 200))
t3 = threading.Thread(target=trade.update_items(201, 300))

t1.start()
t2.start()
t3.start()

#t1.join()
#t2.join()
#t3.join()
与代码一样,我试图删除join()以防止线程等待,但似乎我对这个库的理解是错误的。我在update_items()方法中插入了print()函数,有趣的是,它仍然只是在串行例程中循环,而不是像我想实现的那样,所有3个线程都是并行的


我的正常抓取协议需要大约5个小时才能完成,它只是非常小的数据块,但是HTTP调用总是需要一些时间。我希望至少多次执行此任务,以将抓取时间缩短到30-45分钟左右。

Paul Seeb已正确诊断出您的问题

您正在调用
trade.update\u items
,然后将结果传递给
threading.Thread
构造函数。因此,您得到了串行行为:您的线程不做任何工作,并且每个线程的创建都被延迟,直到
update\u items
调用返回


第一行的正确形式是
threading.Thread(target=trade.update\u items,args=(1100)
,后面的行也是如此。这将传递
update\u items
函数作为线程入口点,
*[1100]
作为其位置参数。

Paul Seeb已正确诊断您的问题

您正在调用
trade.update\u items
,然后将结果传递给
threading.Thread
构造函数。因此,您会得到一系列行为:您的线程不做任何工作,并且每个线程的创建都会延迟,直到
update\u items
调用返回为止


第一行的正确形式是
threading.Thread(target=trade.update\u items,args=(1100)
,后面的行也是如此。这将传递
update\u items
函数作为线程入口点,并传递
*[1100]
作为其位置参数。

要并行获取多个URL,一次最多只能连接20个连接,请执行以下操作:

import urllib2
from multiprocessing.dummy import Pool

def generate_urls(): # generate some dummy urls
    for i in range(100):
        yield 'http://example.com?param=%d' % i

def get_url(url):
    try: return url, urllib2.urlopen(url).read(), None
    except EnvironmentError as e:
         return url, None, e

pool = Pool(20) # limit number of concurrent connections
for url, result, error in pool.imap_unordered(get_url, generate_urls()):
    if error is None:
       print result,

要并行获取多个URL(一次最多20个连接),请执行以下操作:

import urllib2
from multiprocessing.dummy import Pool

def generate_urls(): # generate some dummy urls
    for i in range(100):
        yield 'http://example.com?param=%d' % i

def get_url(url):
    try: return url, urllib2.urlopen(url).read(), None
    except EnvironmentError as e:
         return url, None, e

pool = Pool(20) # limit number of concurrent connections
for url, result, error in pool.imap_unordered(get_url, generate_urls()):
    if error is None:
       print result,

一点一点地?似乎几乎完全涵盖了您的用例。例如,在这个主题上有很多内容也值得注意,除非trade.update_items(1100)返回一个您希望使用以下形式传递参数的函数:threading.Thread(target=trade.update_items,args=(1100))@Fredrarson:Python在I/O上发布GIL。并行检索多个URL是线程的适当使用。一点一点地?似乎几乎完全涵盖了您的用例。例如,在这个主题上有很多内容也值得注意,除非trade.update_items(1100)返回您希望使用以下形式传递参数的函数:threading.Thread(target=trade.update_items,args=(1100))@FredLarson:Python在I/O上释放GIL。并行检索多个URL是线程的适当用法。如果进程是cpu+io绑定的,写入
pool=pool是否公平(multiprocessing.cpu\u count())
no。没有足够的信息进行调用。如果进程是cpu+io绑定的,那么写入
pool=pool(multiprocessing.cpu\u count())是否公平?
no。没有足够的信息进行调用。