Python开发基础--- 进程间通信、进程池、协程

进程间通信

进程彼此之间互相隔离,要实现进程间通信(IPC),multiprocessing模块支持两种形式:队列和管道,这两种方式都是使用消息传递的。

进程队列queue

不同于线程queue,进程queue的生成是用multiprocessing模块生成的。

在生成子进程的时候,会将代码拷贝到子进程中执行一遍,及子进程拥有和主进程内容一样的不同的名称空间。

示例1:

复制代码
 1 import multiprocessing2 def foo():3     q.put([11,'hello',True])4     print(q.qsize())5 6 q=multiprocessing.Queue() #全局定义一个q进程队列,在产生子进程时候会在子进程里生成,可以指定最大数,限制队列长度7 if __name__ == '__main__':8     p=multiprocessing.Process(target=foo,args=()) #因为名称空间不同,子进程的主线程创建的q队列,主进程get不到,所以会阻塞住9     p.start()
10     # foo() #主进程执行一下函数就可以访问到了
11     print(q.get())
复制代码

 

示例2:

复制代码
 1 import multiprocessing2 3 def foo():4     q.put([11,'hello',True])5     print(q.qsize())6 7 if __name__ == '__main__':8     q = multiprocessing.Queue() #主进程创建一个q进程队列9     p=multiprocessing.Process(target=foo,args=()) #因为名称空间不同,子进程的主线程找不到q队列,所以会报错提示没有q
10     p.start()
11     print(q.get())
复制代码

 

示例3:

复制代码
 1 import multiprocessing2 3 def foo(argument):      #定义函数处理进程队列4     argument.put([11,'hello',True])5     print(argument.qsize())6 q = multiprocessing.Queue() #全局定义一个进程队列7 print('test')8 9 if __name__ == '__main__':
10     x = multiprocessing.Queue()   #主进程定义一个进程队列
11     p=multiprocessing.Process(target=foo,args=(x,))     #主进程把值传给子进程就可以处理了
12     p.start()
13     print(x.get())
14     # foo(q)
15     # print(q.get())
复制代码

 

常用方法

复制代码
q.put方法用以插入数据到队列中,put方法还有两个可选参数:blocked和timeout。如果blocked为True(默认值),并且timeout为正值,该方法会阻塞timeout指定的时间,直到该队列有剩余的空间。如果超时,会抛出Queue.Full异常。如果blocked为False,但该Queue已满,会立即抛出Queue.Full异常。
q.get方法可以从队列读取并且删除一个元素。同样,get方法有两个可选参数:blocked和timeout。如果blocked为True(默认值),并且timeout为正值,那么在等待时间内没有取到任何元素,会抛出Queue.Empty异常。如果blocked为False,有两种情况存在,如果Queue有一个值可用,则立即返回该值,否则,如果队列为空,则立即抛出Queue.Empty异常.
q.get_nowait():同q.get(False)
q.put_nowait():同q.put(False)
q.empty():调用此方法时q为空则返回True,该结果不可靠,比如在返回True的过程中,如果队列中又加入了项目。
q.full():调用此方法时q已满则返回True,该结果不可靠,比如在返回True的过程中,如果队列中的项目被取走。
q.qsize():返回队列中目前项目的正确数量,结果也不可靠,理由同q.empty()和q.full()一样
复制代码

 

其他方法

复制代码
q.cancel_join_thread():不会在进程退出时自动连接后台线程。可以防止join_thread()方法阻塞
q.close():关闭队列,防止队列中加入更多数据。调用此方法,后台线程将继续写入那些已经入队列但尚未写入的数据,但将在此方法完成时马上关闭。如果q被垃圾收集,将调用此方法。关闭队列不会在队列使用者中产生任何类型的数据结束信号或异常。例如,如果某个使用者正在被阻塞在get()操作上,关闭生产者中的队列不会导致get()方法返回错误。
q.join_thread():连接队列的后台线程。此方法用于在调用q.close()方法之后,等待所有队列项被消耗。默认情况下,此方法由不是q的原始创建者的所有进程调用。调用q.cancel_join_thread方法可以禁止这种行为
复制代码

 

另一个创建进程队列的类

http://www.cnblogs.com/zero527/p/7211909.html

管道pipe

管道就是管道,就像生活中的管道,两头都能进能出

默认管道是全双工的,如果创建管道的时候映射成False,左边只能用于接收,右边只能用于发送,类似于单行道

最简单的管道双向通信示例:

复制代码
 1 import multiprocessing2 3 def foo(sk):4     sk.send('hello world')5     print(sk.recv())6 7 if __name__ == '__main__':8     conn1,conn2=multiprocessing.Pipe()    #开辟两个口,都是能进能出,括号中如果False即单向通信9     p=multiprocessing.Process(target=foo,args=(conn1,))  #子进程使用sock口,调用foo函数
10     p.start()
11     print(conn2.recv())  #主进程使用conn口接收
12     conn2.send('hi son') #主进程使用conn口发送
复制代码

 

常用方法

conn1.recv():接收conn2.send(obj)发送的对象。如果没有消息可接收,recv方法会一直阻塞。如果连接的另外一端已经关闭,那么recv方法会抛出EOFError。
conn1.send(obj):通过连接发送对象。obj是与序列化兼容的任意对象
注意:send()和recv()方法使用pickle模块对对象进行序列化

 

其他方法

复制代码
conn1.close():关闭连接。如果conn1被垃圾回收,将自动调用此方法,不用的时候两边都要closeconn1.fileno():返回连接使用的整数文件描述符conn1.poll([timeout]):如果连接上的数据可用,返回True。timeout指定等待的最长时限。如果省略此参数,方法将立即返回结果。如果将timeout射成None,操作将无限期地等待数据到达。conn1.recv_bytes([maxlength]):接收c.send_bytes()方法发送的一条完整的字节消息。maxlength指定要接收的最大字节数。如果进入的消息,超过了这个最大值,将引发IOError异常,并且在连接上无法进行进一步读取。如果连接的另外一端已经关闭,再也不存在任何数据,将引发EOFError异常。conn.send_bytes(buffer [, offset [, size]]):通过连接发送字节数据缓冲区,buffer是支持缓冲区接口的任意对象,offset是缓冲区中的字节偏移量,而size是要发送字节数。结果数据以单条消息的形式发出,然后调用c.recv_bytes()函数进行接收    conn1.recv_bytes_into(buffer [, offset]):接收一条完整的字节消息,并把它保存在buffer对象中,该对象支持可写入的缓冲区接口(即bytearray对象或类似的对象)。offset指定缓冲区中放置消息处的字节位移。返回值是收到的字节数。如果消息长度大于可用的缓冲区空间,将引发BufferTooShort异常。
复制代码

 

注意:生产者和消费者都没有使用管道的某个端点,就应该将其关闭,如在生产者中关闭管道的右端,在消费者中关闭管道的左端。如果忘记执行这些步骤,程序可能再消费者中的recv()操作上挂起。管道是由操作系统进行引用计数的,必须在所有进程中关闭管道后才能生产EOFError异常。因此在生产者中关闭管道不会有任何效果,付费消费者中也关闭了相同的管道端点。

 1 from multiprocessing import Process,Pipe2 3 import time,os4 def consumer(p,name):5     left,right=p6     left.close()7     while True:8         try:9             baozi=right.recv()
10             print('%s 收到包子:%s' %(name,baozi))
11         except EOFError:
12             right.close()
13             break
14 def producer(seq,p):
15     left,right=p
16     right.close()
17     for i in seq:
18         left.send(i)
19         # time.sleep(1)
20     else:
21         left.close()
22 if __name__ == '__main__':
23     left,right=Pipe()
24     c1=Process(target=consumer,args=((left,right),'c1'))
25     c1.start()
26     seq=(i for i in range(10))
27     producer(seq,(left,right))
28     right.close()
29     left.close()
30     c1.join()
31     print('主进程')

复制代码
 1 from multiprocessing import Process,Pipe2 3 import time,os4 def consumer(p,name):5     left,right=p6     left.close()7     while True:8         try:9             baozi=right.recv()
10             print('%s 收到包子:%s' %(name,baozi))
11         except EOFError:
12             right.close()
13             break
14 def producer(seq,p):
15     left,right=p
16     right.close()
17     for i in seq:
18         left.send(i)
19         # time.sleep(1)
20     else:
21         left.close()
22 if __name__ == '__main__':
23     left,right=Pipe()
24     c1=Process(target=consumer,args=((left,right),'c1'))
25     c1.start()
26     seq=(i for i in range(10))
27     producer(seq,(left,right))
28     right.close()
29     left.close()
30     c1.join()
31     print('主进程')
复制代码

 

 

共享数据manage

Queue和pipe只是实现了数据交互,并没实现数据共享,即一个进程去更改另一个进程的数据

注:进程间通信应该尽量避免使用共享数据的方式

 

共享数据:列表

复制代码
 1 from multiprocessing import Manager,Process2 def foo(l,i):3     l.append(i**i)4 if __name__ == '__main__':5     man=Manager()6     ml=man.list([11,22,33])7     l=[]8     for i in range(5):9         p=Process(target=foo,args=(ml,i))
10         p.start()
11         l.append(p)
12     for i in l: #必须要join,不然会执行报错,处理一个数据必须要一个个来,不能同时处理一个数据
13         i.join()
14     print(ml)
复制代码

 

共享数据:字典

复制代码
 1 from multiprocessing import Manager,Process2 def foo(d,k,v):3     d[k]=v4 if __name__ == '__main__':5     man=Manager()6     md=man.dict({'name':'bob'})7     l=[]8     for i in range(5):9         p=Process(target=foo,args=(md,i,'a'))
10         p.start()
11         l.append(p)
12     for i in l: #必须要join,不然会执行报错,处理一个数据必须要一个个来,不能同时处理一个数据
13         i.join()
14     print(md)
复制代码

 

 

进程池

开多进程是为了并发,通常有几个cpu核心就开几个进程,但是进程开多了会影响效率,主要体现在切换的开销,所以引入进程池限制进程的数量。

进程池内部维护一个进程序列,当使用时,则去进程池中获取一个进程,如果进程池序列中没有可供使用的进进程,那么程序就会等待,直到进程池中有可用进程为止。

示例:

复制代码
 1 from multiprocessing import Pool2 import time3 4 def foo(n):5     print(n)6     time.sleep(1)7 8 if __name__ == '__main__':9     pool_obj=Pool(5)    #
10     for i in range(47):
11         # pool_obj.apply_async(func=foo,args=(i,))
12         pool_obj.apply(func=foo,args=(i,))    #子进程的生成是靠进程池对象维护的
13         # apply同步,子进程一个个执行
14         # apply_async异步,多个子进程一起执行
15     pool_obj.close()
16     pool_obj.join()
17     print('ending')
复制代码

 

常用方法:

复制代码
pool_obj.apply(func [, args [, kwargs]]):在一个池工作进程中执行func(*args,**kwargs),然后返回结果。需要强调的是:此操作并不会在所有池工作进程中并执行func函数。如果要通过不同参数并发地执行func函数,必须从不同线程调用p.apply()函数或者使用p.apply_async()
pool_obj.apply_async(func [, args [, kwargs]]):在一个池工作进程中执行func(*args,**kwargs),然后返回结果。此方法的结果是AsyncResult类的实例,callback是可调用对象,接收输入参数。当func的结果变为可用时,将理解传递给callback。callback禁止执行任何阻塞操作,否则将接收其他异步操作中的结果。
pool_obj.close():关闭进程池,防止进一步操作。如果所有操作持续挂起,它们将在工作进程终止前完成
pool_obj.jion():等待所有工作进程退出。此方法只能在close()或teminate()之后调用
复制代码

 

其他方法:

复制代码
方法apply_async()和map_async()的返回值是AsyncResul的实例obj。实例具有以下方法
obj.get():返回结果,如果有必要则等待结果到达。timeout是可选的。如果在指定时间内还没有到达,将引发一场。如果远程操作中引发了异常,它将在调用此方法时再次被引发。
obj.ready():如果调用完成,返回True
obj.successful():如果调用完成且没有引发异常,返回True,如果在结果就绪之前调用此方法,引发异常
obj.wait([timeout]):等待结果变为可用。
obj.terminate():立即终止所有工作进程,同时不执行任何清理或结束任何挂起工作。如果p被垃圾回收,将自动调用此函数
复制代码

 

 

协程

协程:是单线程下的并发,又称微线程,纤程。英文名Coroutine。

一句话说明什么是线程:协程是一种用户态的轻量级线程,即协程是由用户程序自己控制调度的。

协程能保留上一次调用时的状态(即所有局部状态的一个特定组合),每次过程重入时,就相当于进入上一次调用的状态,换种说法:进入上一次离开时所处逻辑流的位置。

注意:

  1. python的线程属于内核级别的,即由操作系统控制调度(如单线程一旦遇到io就被迫交出cpu执行权限,切换其他线程运行)

  2. 单线程内开启协程,一旦遇到io,从应用程序级别(而非操作系统)控制切换

协程优点:

  1.  协程的切换开销更小,属于程序级别的切换,操作系统完全感知不到,因而更加轻量级

  2. 单线程内就可以实现并发的效果,最大限度地利用cpu

协程缺点:

  1.协程的本质是单线程下,无法利用多核,可以是一个程序开启多个进程,每个进程内开启多个线程,每个线程内开启协程

  2.协程指的是单个线程,因而一旦协程出现阻塞,将会阻塞整个线程

yield实现协程并发

复制代码
 1 import time2 def consumer():3     r=''4     while True:5         n=yield r6         if not n:7             return8         print('[CONSUMER] ←← Consuming %s...' % n)9         time.sleep(1)
10         r='200 Ok'
11 
12 def produce(c):
13     next(c) #1.启动生成器
14     n=0
15     while n < 5:
16         n=n+1
17         print('[PRODUCER] →→ Producing %s...' % n)
18         cr=c.send(n)    
19         #2.将n传入到consumer的对象,yield接收到传入值开始执行代码,遇到yield执行代码返回r的值
20         print('[PRODUCER] Consumer return: %s' % cr)
21     #3.produce没有值了,关闭整个过程
22     c.close()
23 
24 if __name__ == '__main__':
25     c=consumer()    #生成生成器对象
26     produce(c)      #执行调用
复制代码

 

 

greenlet框架实现协程(封装yield的基础库)

greenlet机制的主要思想是:生成器函数或者协程函数中的yield语句挂起函数的执行,直到稍后使用next()或send()操作进行恢复为止。可以使用一个调度器循环在一组生成器函数之间协作多个任务。greentlet是python中实现我们所谓的"Coroutine(协程)"的一个基础库。

示例1:

复制代码
 1 from greenlet import  greenlet2 def foo():3     print('ok1')4     g2.switch() #阻断5     print('ok3')6     g2.switch()7 def bar():8     print('ok2')9     g1.switch()
10     print('ok4')
11 
12 g1=greenlet(foo)    #生成foo函数的greenlet对象
13 g2=greenlet(bar)    #生成bar函数的greenlet对象
14 g1.switch() #1、执行g1对象,打印ok1
15             #2、遇到g2.switch(),转到g2执行打印ok2
16             #3、遇到g1.switch(),转到g1的阻断处继续执行打印ok3
17             #4、遇到g2.switch(),转到g2执行打印ok4
复制代码

 

示例2:

复制代码
 1 def eat(name):2     print('%s eat food 1' %name)3     gr2.switch('bob')4     print('%s eat food 2' %name)5     gr2.switch()6 def play_phone(name):7     print('%s play 1' %name)8     gr1.switch()9     print('%s play 2' %name)
10 
11 gr1=greenlet(eat)
12 gr2=greenlet(play_phone)
13 gr1.switch(name='natasha')#可以在第一次switch时传入参数,以后都不需要
复制代码

 

这种方法不会节省时间,因为不是io操作,而greenlet遇到io操作不会跳转,仍然要io阻断

 

基于greenlet框架的高级库gevent模块

gevent是第三方库,通过greenlet实现协程,其基本思想是:

当一个greenlet遇到IO操作时,比如访问网络,就自动切换到其他的greenlet,等到IO操作完成,再在适当的时候切换回来继续执行。由于IO操作非常耗时,经常使程序处于等待状态,有了gevent为我们自动切换协程,就保证总有greenlet在运行,而不是等待IO。

由于切换是在IO操作时自动完成,所以gevent需要修改Python自带的一些标准库,这一过程在启动时通过monkey patch完成:

简单示例:

复制代码
 1 import gevent2 def foo():3     print('ok1')4     gevent.sleep(4) #模拟io操作5     print('ok3')6 def bar():7     print('ok2')8     gevent.sleep(2)9     print('ok4')
10 
11 g1=gevent.spawn(foo)
12 g2=gevent.spawn(bar)
13 gevent.joinall([g1,g2]) #全部阻塞,或者单独一个个join
复制代码

 

spawn括号内第一个参数是函数名,如foo,后面可以有多个参数,可以是位置实参或关键字实参,都是传给函数foo的

注意:

gevent.sleep(4)模拟的是gevent可以识别的io阻塞,

而time.sleep(2)或其他的阻塞,gevent是不能直接识别的需要用下面一行代码,打补丁,就可以识别了

1 #补丁
2 from gevent import monkey
3 monkey.patch_all()

 

必须放到被打补丁者的前面,如time,socket模块之前

或者我们干脆记忆成:要用gevent,需要将补丁放到文件的开头

爬虫示例:

复制代码
 1 from gevent import monkey;monkey.patch_all()2 import gevent3 import requests4 import time5 6 def get_page(url):7     print('GET: %s' %url)8     response=requests.get(url)9     if response.status_code == 200:
10         print('%d bytes received from %s' %(len(response.text),url))
11 
12 
13 start_time=time.time()
14 gevent.joinall([
15     gevent.spawn(get_page,'https://www.python.org/'),
16     gevent.spawn(get_page,'https://www.yahoo.com/'),
17     gevent.spawn(get_page,'https://github.com/'),
18 ])
19 stop_time=time.time()
20 print('run time is %s' %(stop_time-start_time))
复制代码

 

复制代码
gevent是一个基于协程(coroutine)的Python网络函数库,通过使用greenlet提供了一个在libev事件循环顶部的高级别并发API。主要特性有以下几点:<1> 基于libev的快速事件循环,Linux上面的是epoll机制<2> 基于greenlet的轻量级执行单元<3> API复用了Python标准库里的内容<4> 支持SSL的协作式sockets<5> 可通过线程池或c-ares实现DNS查询<6> 通过monkey patching功能来使得第三方模块变成协作式gevent.spawn()方法spawn一些jobs,然后通过gevent.joinall将jobs加入到微线程执行队列中等待其完成,设置超时为2秒。执行后的结果通过检查gevent.Greenlet.value值来收集。===========================二
1、关于Linux的epoll机制:epoll是Linux内核为处理大批量文件描述符而作了改进的poll,是Linux下多路复用IO接口select/poll的
增强版本,它能显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率。epoll的优点:(1)支持一个进程打开大数目的socket描述符。select的一个进程所打开的FD由FD_SETSIZE的设置来限定,而epoll没有这个限制,它所支持的FD上限是
最大可打开文件的数目,远大于2048。(2)IO效率不随FD数目增加而线性下降:由于epoll只会对“活跃”的socket进行操作,于是,只有”活跃”的socket才会主动去调用 callback函数,其他
idle状态的socket则不会。(3)使用mmap加速内核与用户空间的消息传递。epoll是通过内核于用户空间mmap同一块内存实现的。(4)内核微调。2、libev机制提供了指定文件描述符事件发生时调用回调函数的机制。libev是一个事件循环器:向libev注册感兴趣的事件,比如socket可读事件,libev会对所注册的事件
的源进行管理,并在事件发生时触发相应的程序。===========================三‘’‘import geventfrom gevent import socketurls = [‘www.google.com.hk’,’www.example.com’, ‘www.python.org’ ]jobs = [gevent.spawn(socket.gethostbyname, url) for url in urls]gevent.joinall(jobs, timeout=2)[job.value for job in jobs][‘74.125.128.199’, ‘208.77.188.166’, ‘82.94.164.162’]’‘’gevent.spawn()方法spawn一些jobs,然后通过gevent.joinall将jobs加入到微线程执行队列中等待其完成,设置超时为2秒。执行后的结果通过检查gevent.Greenlet.value值来收集。gevent.socket.gethostbyname()函数与标准的socket.gethotbyname()有相同的接口,但它不会阻塞整个解释器,因此会使得其他的greenlets跟随着无阻的请求而执行。Monket patchingPython的运行环境允许我们在运行时修改大部分的对象,包括模块、类甚至函数。虽然这样做会产生“隐式的副作用”,而且出现问题很难调试,但在需要修改Python本身的基础行为时,Monkey patching就派上用场了。Monkey patching能够使得gevent修改标准库里面大部分的阻塞式系统调用,包括socket,ssl,threading和select等模块,而变成协作式运行。from gevent import monkey ;monkey . patch_socket ()import urllib2通过monkey.patch_socket()方法,urllib2模块可以使用在多微线程环境,达到与gevent共同工作的目的。事件循环不像其他网络库,gevent和eventlet类似, 在一个greenlet中隐式开始事件循环。没有必须调用run()或dispatch()的反应器(reactor),在twisted中是有 reactor的。当gevent的API函数想阻塞时,它获得Hub实例(执行时间循环的greenlet),并切换过去。如果没有集线器实例则会动态 创建。libev提供的事件循环默认使用系统最快轮询机制,设置LIBEV_FLAGS环境变量可指定轮询机制。LIBEV_FLAGS=1为select, LIBEV_FLAGS = 2为poll, LIBEV_FLAGS = 4为epoll,LIBEV_FLAGS = 8为kqueue。Libev的API位于gevent.core下。注意libev API的回调在Hub的greenlet运行,因此使用同步greenlet的API。可以使用spawn()和Event.set()等异步API。
复制代码

 

转载于:https://www.cnblogs.com/chenqizhou/p/7359689.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/487788.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux中sed命令用例,Linux中使用sed命令或awk命令修改常规配置文件

一、方案&#xff1a;Linux中使用sed命令或awk命令修改常规配置文件二、步骤&#xff1a;1、假设有一个a.txt&#xff0c;内容如下&#xff1a;#!/bin/bashaabbbccc#ddd2、如果想要把里面的内容bbb23输出成bbb55&#xff0c;可以这样做&#xff1a;sed s/bbb23/bbb55/g a.txt说…

python数据分析笔记中panda(2)

1 将手机号码分开为运营商&#xff0c;地区和号码段 1 from pandas import read_csv;2 3 df read_csv("H:\\pythonCode\\4.6\\data.csv");4 5 6 #转换成字符数据 方便用slice7 df[tel] df[tel].astype(str);8 9 #字符的抽取&#xff1a;根据已知列数…

刘忠范院士:新型研发机构建设成了口号

来源&#xff1a;科学网作者 | 郑金武编辑 | 宗华排版 | 华园● 刘忠范认为&#xff0c;如果只是单纯地再建一两所研究机构&#xff0c;在机制、理念上与现有的高校和研究院所没有差别&#xff0c;那就是在“1000”的基础上再加“1”&#xff0c;对现有的科研格局不会带来任何改…

linux属性表示的文件,Linux基础入门:文件和目录属性的含义

比如 &#xff1a;[rootistester isTester]# lltotal 12drwxr-xr-x 2 root root 4096 May 21 17:58 21Day-rw-r-xr-- 1 root root 6 May 14 16:04 idoxu.ini-rw-r--r-- 1 root root 0 May 21 17:12 istester.ini-rw-r--r-- 1 root root 10 May 14 16:02 README.md解释&…

一线工程师如何看待《没了美国的EDA软件,我们就不能做芯片了》

来源&#xff1a;真视界这些天看了不少讲国内EDA情况的帖子&#xff0c;有客观的也有极其离谱的&#xff0c;作为一名从业十余年的芯片设计工程师&#xff0c;我以一线从业者的角度来谈谈我们在实际工作中的EDA软件使用情况究竟是怎样的吧。先回答个很常见的问题&#xff1a;没…

2015Cocos游戏开发大赛作品——人鱼塞壬

***************************************转载请注明出处&#xff1a;http://blog.csdn.net/lttree******************************************** 消失了一个月&#xff0c;干啥去了捏&#xff1f; 就是做这个游戏了&#xff08;事实上 考试课设北京。。。&#xff09; 游戏背…

柳叶刀发布陈薇团队新冠疫苗试验结果:安全,能诱导免疫反应

来源&#xff1a;腾讯新闻客户端自媒体论文称&#xff0c;研究显示&#xff0c;前述以腺病毒Ad5为载体的新冠疫苗&#xff0c;在给志愿者接种后28天时&#xff0c;显示出免疫原性和人体耐受性。在健康成年人中&#xff0c;对SARS-CoV-2的体液免疫反应&#xff0c;在接种疫苗后第…

UE4从4.15移植到4.16

如果是旧版本的工程需要移植到4.16&#xff0c;有几个地方需要修改&#xff1a; 假设RC是工程名&#xff0c;修改如下(三个CS文件) 类似的&#xff0c;插件也需要这样修改 转载于:https://www.cnblogs.com/AnKen/p/7365806.html

c语言Linux用线程创建文件,Linux环境下C语言线程创建---简单代码

在Linux环境下用C语言编写线程创建。//file name: pthreadtext.c#include #include //线程头文件//pthread不是linux下的默认的库&#xff0c;也就是在链接的时候&#xff0c;无法找到phread库中哥函数的入口地址&#xff0c;于是链接会失败//在gcc编译的时候&#xff0c;附加要…

自动驾驶发展到了哪个阶段?七大应用场景走进现实

来源&#xff1a; 智车科技2020年初&#xff0c;新冠疫情突发&#xff0c;百度、京东、美团等在各地提供无人配送、无人清扫服务。在抗击疫情的过程中&#xff0c;自动驾驶商业化得到了很好的实践验证。当自动驾驶技术渐渐走入现实场景&#xff0c;那么我们不禁要问这项技术究竟…

2016 博客导读总结 amp; 个人感悟

此文着笔之时。2017已经在眼前了。预计等我写完&#xff0c;2017已经到了。二次编辑于2017年1月1日早11点。 关于2016的感悟。十二月初就想写&#xff0c;当时认为是有点太早了&#xff0c;只是却思绪如泉涌。 且那时候才刚刚申请到博客专家&#xff08;訪问量刚刚过5W&#x…

IBM 向云转型、大幅裁员、连 Watson 和 AI 团队也未能幸免

来源&#xff1a;云头条IBM提前30天通知成千上万名员工被裁&#xff0c;可领取90天的薪水&#xff0c;至少在美国是这样&#xff0c;而服务部门首当其冲。IBM正在大举裁员&#xff0c;数量众多的与云计算业务无关的员工被告知他们在蓝色巨人的时间到头了。这个IT巨头在回复IT外…

linux网络包截获,用C实现截获网络数据包

现在进入第二步&#xff0c;捕获数据包。从第20行开始&#xff0c;我们进入了一个死循环&#xff0c;while(1)&#xff0c;在第24行&#xff0c;recvfrom(sock, buffer, sizeof buffer, 0, (struct sockaddr *)&from, &fromlen)&#xff0c;这个函数要做的就是接收数据…

自动驾驶的实现之路——几大关键传感器应用解析

来源&#xff1a;MEMS随着近两年来智慧汽车、车联网等等概念的兴起&#xff0c;汽车自动驾驶的各种科技进展不断占据媒体版面&#xff0c;引起了全球的关注和各国政府的支持。对于大部分人来说&#xff0c; “吃着火锅唱着歌”轻轻松松地直达目的地绝对是美好的愿望&#xff0c…

探索“植物人”语言能力和意识水平

来源&#xff1a;脑科学与智能技术卓越创新中心2020年5月25日&#xff0c;中国科学院脑科学与智能技术卓越创新中心&#xff08;神经科学研究所&#xff09;、中国科学院灵长类神经生物学重点实验室王立平研究组与复旦大学附属华山医院神经外科毛颖/吴雪海团队在《自然-神经科学…

探臻实录 | 戴琼海:搭建脑科学与人工智能的桥梁

来源&#xff1a;探臻科技评论人工智能作为21世纪最具有影响力的技术&#xff0c;正在包括诸如机器人、语言识别、图像识别、自然语言处理等诸多领域发挥着重要作用。脑科学被誉为“人类科学最后的前沿”&#xff0c;认识脑的奥秘是对人类的终极挑战。而更重要的是&#xff0c;…

linux下的单机工具,Linux下单机模式的Hadoop部署

需要软件&#xff1a;ssh&#xff1a;fedore 9 自带。jdk&#xff1a;http://java.sun.com/javase/downloads/index.jsp&#xff0c;下最近版本jdk-6u18-linux-i586Hadoop&#xff1a;http://apache.etoak.com/hadoop/core/hadoop-0.20.1/&#xff0c;最新版本0.20.1&#xff0…

全球顶尖计算机科学家排名,中科大上榜人数全国第一

来源&#xff1a;今日头条一年一度的全球顶尖计算机科学家TOP1000榜单出炉&#xff0c;这份由Guide2Research发布的计算机科学家排名中&#xff0c;中国科学技术大学以16人入选力压清华、北大、浙大等计算机科学强校&#xff0c;高居全国第一&#xff01;中科大张亚勤等13位本科…

CentOS6实现路由器功能

网络之间的通信主要是依靠路由器&#xff0c;当然生成环境中是拥有路由器的&#xff0c;但是系统中的路由配置也是需要了解一下地&#xff0c;今天讲解一下在CentOS6环境下搭建路由器&#xff0c;此乃入门级的简单实验。拓扑如上图已经规划好&#xff0c;暂且使用静态路由演示。…

在近期,美众议院为何密集提出了15项新兴技术法案?

来源&#xff1a;资本实验室近期&#xff0c;美国众议院能源和商业委员会及消费者保护与商业小组委员会密集提出了15项与新兴技术相关的法案议程。这些法案开宗明义&#xff0c;建立了明确的目标&#xff1a;确保美国在新兴技术领域的领导地位&#xff0c;以在全球竞争力方面战…